linux 中进程的状态
Linux 进程状态详解:运行、睡眠、僵尸等 7 种进程状态分析
Daemon进程生命周期长且在后台运行。编写daemon进程需要遵循哪些规则呢?
执行这一步,原因有两个:
(1) 修改当前目录为根目录如果当前工作路径上包含根文件系统以外的文件系统,那么这个文件系统将不能被卸载。当然也可以改成其它合适的目录。这里使用函数chdir("/")。
(2) 调用setsid 这是为了切断与控制终端的所有关系,创建一个新的会话。此时无论终端是否发送SIGIN、SIGQUIT或者SIGTSTP或者断开,都与daemon进程无关。
(3) 使用umask(0)设置文件模式创建掩码为0 这一步的目的是让daemon进程创建文件的权限属性与shell脱离关系。因为默认情况下,进程的umask来源于父进程shell的umask。如果不执行umask(0),那么父进程的shell就会影响daemon,造成daemon每次执行的umask信息不一致。
执行完前面两步之后,新建了会话,进程是会话的首进程,也是进程组的首进程;进程ID,进程组ID,会话ID相同;进程和终端失去联系。但是还差一步。daemon进程有可能会打开一个终端设备:
int fd = open("/dev/console", O_RDWR);
这个设备是否会成为daemon进程的控制终端,取决于两点:
为了万无一失,需要使用fork()确保daemon不是会话的首进程。
关闭之后应该打开/dev/null将0,1,2描述符指向它。这是为了防止后面执行0,1,2上的I/O时出现错误。
C库的daemon函数和这个流程相似,但没有第二次fork。
By Liao Tonglang.
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
Linux 进程状态详解:运行、睡眠、僵尸等 7 种进程状态分析
汇总本站 Linux 内核工程相关文章:eBPF / Cilium、io_uring、零拷贝权衡、无锁与内存屏障,以及分配器与调度实践。
sendfile/splice/io_uring 的 zero-copy 路径深度解析与实测。揭示小数据包场景下传统 copy 因 cache locality 反而更快的反直觉真相。
Linux 内核 ACCESS_ONCE/READ_ONCE/WRITE_ONCE 宏详解:并发编程与内存访问