阿男的小窝

View the Project on GitHub

daemon process、fork、execve

daemon process就是指会一直在操作系统的生命周期里运行的进程。具体可以看这篇:

一般是各种服务类型的进程会把自身运行成daemon process,比如web server,数据库的服务进程,等等。

查看daemon进程可以靠ps命令,比如下面的命令:

上面的进程,可以看到postgres这个数据库的服务主进程,他的PPID,也就是parent id是1.1号进程是init进程,所以挂在1号进程下的子进程,只有操作系统shutdown的时候才会主动退出,因此这样的进程会保持运行状态,也就是daemon process。

fork和execve

接下来说一下fork()execve()这两个system calls。其中fork()会创建一个新的process,下面是例子:

执行fork以后,kernel就创建了一个新的process,所以当前process和新创建的子进程的到的p,也就是各自的process id,就不同了。所以上面的代码中,使用p的值就可以判断自己是父进程还是子进程了。

这里面有几个基础概念:

所以上面的代码,其父进程和子进程是在fork()之后分叉的。

说完了fork(),说说execve()。这个system call会把一个新的程序读到当前process的code space。下面是例子:

可以看到程序运行到execve那行的时候,当前process的程序就从上面这个替换成了/bin/echo。如果execve加载echo正确,程序的后续部分就不会执行了。

因此,如果结合使用fork()execve(),就是操作系统执行一个新的程序的方式了。

所以每一个子进程都有一个父进程,如果父进程先退出,那么子进程就会被挂在自己父进程的上一级父进程上。如果一个进程挂在init process上,它的生命周期就是在操作系统运行期间保持运行。

关于本文中所讲解的一些概念,还是要仔细阅读apue和tlpi两本书的相关章节进行系统的学习。