wuhuaji | blog

wuhuaji | blog

写一点有用的代码

孤儿进程和僵尸进程
其实这两个概念并不难理解,只要明白了以下两个关键点就可以了: 除了init进程(进程号为1,从名字就能知道负责系统启动后的相关的初始化工作)外,其他所有的进程都有父进程。也就是进程是一个树形结构,树的顶端是init进程 一个进程都会占用系统资源(内存、文件描述符等),当进程结束后就需要由其父进程来释放它占用的资源 那么父进程如何释放子进程资源呢?父进程需要通过wait/waitpid等系统调用函数来等待进程结束,并且可以通过这些函数来获取子进程的退出状态(正常退出,信号杀死等等) 孤儿进程明白了父子进程的关系,那么有一个问题:如果父进程先于子进程终止,子进程的资源岂不是没人来释放了?...
tinyshell:学习写一个简单的Shell
最近三周实现了一个简单的shell: tinyshell 最近三周的空闲时间,我都在学习写一个shell,虽然只完成了一些基础的功能,很多特性尚未实现,代码写的也很挫,而且可以确定的是还藏有不少bug。但我觉得这个项目第一个阶段已告一段落,值得写一篇博客纪念一下。 代码地址:https://github.com/WuHuaJi0/tinyshell。正如其名:tinyshell,到目前为止也只有五百多行的代码。除了实现最基础的:读取用户输出的一串命令并执行的功能外,还实现了:管道,重定向,history,cd 这些特性。还有一些想实现的特性写在readme中,就不复制过来了。 为什么想...
C拾遗:字符串常量在内存中如何存储?
碰到这样一个问题,代码简化之后如下: 123456789#include <stdio.h>char *get_string(){ char *string = "hello world"; return string;}int main(int argc, char *argv[]){ char *result = get_string(); printf("%s\n",result); //会输出:hello world} 代码很简单,在 main 中调用 get_string 函数,这个函数返回一个指向”...
系统编程:信号(2)
这篇博文只是记录我信号的一点笔记,并不详细也不权威,建议阅读《Linux/Unix系统编程手册》 上一篇:系统编程:信号(1) 上一篇中说到了信号的基本概念,这篇记录一下信号处理函数。 我们已经知道进程接受到一个信号,会有默认的行为,比如SIGINT SIGKILL对应的是终止进程。既然说是默认行为,那么是否可以改变默认行为呢? 答案是肯定的。Linux系统中提供了两种系统调用来改变信号的对应行为:signal() 和 sigaction() 这里以signal()调用来举例。关于这个函数的原型可以通过man 2 signal来查看,这里简单的说一下:signal函数接收两个参数:1需...
跨域响应头总结
在 如何跨域 这篇博文中,记录了跨域的基本概念、JSONP的原理、还有CROS的概念。但这篇博文相对简单,对于CROS只提到了Access-Control-Allow-Origin响应头,其实对于跨域还有更多的响应头,这里复习一下。 Access-Control-Allow-Origin首先记录还是这个Access-Control-Allow-Origin,这个响应头表明服务器允许跨域访问的域名,只有设置了这个头,跨域时响应才不会被浏览器拦截。这是万里长征第一步。 Access-Control-Allow-Credentials直接引用mdn的解释: 响应头表示是否可以将对请求的响应暴...
系统编程:信号(1)
这篇博文只是记录我信号的一点笔记,并不详细也不权威,建议阅读《Linux/Unix系统编程手册》 下一篇:系统编程:信号(2) 信号是操作系统中一个重要的概念:是指某些事件发生时,对于进程的通知机制,也叫软件中断。 上面的解释似乎还不够具体,举两个例子: 在shell中,运行一个耗时任务,如果我们想中途停止,那么我们可能习惯性的按下 Ctrl + C,任务就会停止。这里按下 Ctrl + C 后,内核就会给当前进程发送一个信号:SIGINT(终端中断信号),进程接受到就会停止运行。 同样的,有时候我们可能会用kill这个命令来杀死一个进程,也就是:kill 进程号,进程就能停止了。原...
编译安装PHP
如果要安装PHP,一般来说是直接下载已经编译好的二进制文件,在PHP文档中有各个平台的安装指导。但是如果想认真研究一下PHP,自己手动编译安装一下,显然是很有必要的。 下载源码PHP源码可以在GitHub上找到,直接克隆下来即可,也可借此机会一窥PHP的源码结构。 1git clone git@github.com:php/php-src.git 默认的master分支似乎是在开发 PHP 8 ,我们可以切换到一个稳定分支,比如:git checkout PHP-7.1.29 编译源码下载之后,就可根据文档的指示开始编译PHP了。其实PHP就是一个由C语言编写的程序,如果熟悉...
全局配置gitignore
今天才知道 Git 可以设置全局的 gitignore, 通过全局设置gitignore ,可以省去很多重复配置。比如: 编辑器生成的配置文件 .idea/ .vscode 系统生成的无关文件 .DS_Store vim缓存文件:xxx.swp 各种日志文件 等等。完全可以设置在全局 gitignore 中。 首先确认一下是否已有全局 gitignore:git config --get core.excludesfile 这个命令查询是否配置有全局gitignore,如果已配置有,则能看到文件路径 如果没有,则可以创建:git config --global core.exclud...
HTTP之:Host字段和虚拟主机
一转眼两个多月没有写博客了,还是要把写博客的习惯捡起来,今天就写一点简单的,复习一下Host字段。 HTTP请求头中一般有一个Host字段,可能很多人对这个字段习以为常,并不觉得有什么作用。 我们知道,浏览器会查询域名的DNS,从而就能找到域名背后的服务器ip地址,将请求发往这个ip地址,再从这里接收响应,一次简单的请求就算完成了。 但是这里有一个问题,如果这个服务器托管的不只是一个网站,而是成千上万个网站呢?浏览器的请求发过来,服务器怎么知道你要访问的究竟是哪一个网站呢?这就需要通过Host字段来标识了。 大致过程如下:1,服务器软件(Web Server)通过配置,给各个域名分别配...
一些HTTP调试工具和技巧
今天有些时间,总结一下平常HTTP调试的一些思路、工具和技巧。不够系统,经验之谈。 浏览器网络调试工具一般来说只要不是什么疑难杂症,都可以通过浏览器的网络调试工具调出来。观察状态码/请求头/响应头/响应内容等这些信息,大部分问题就能找到。这也是比较基础的一步,网上教程铺天盖地,不再细说。 Curl在很多时候,发出去的HTTP请求怎么也得不到预期的结果。比如刚才还好好的,怎么现在就不行了?又或者明明我这里可以,你那里就是不行呢?对于这些问题,如果浏览器网络调试不能直观得到解决,我通常使用curl来调试。 首先分别将正常的请求,和异常的请求,都复制成Curl,如下图: 复制出来的内容是这样的...
avatar
吴化吉