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()
的时候创建的,所以它的pc指针也会指向fork之后的代码。
所以上面的代码,其父进程和子进程是在fork()
之后分叉的。
说完了fork()
,说说execve()
。这个system call会把一个新的程序读到当前process的code space。下面是例子:
可以看到程序运行到execve
那行的时候,当前process的程序就从上面这个替换成了/bin/echo
。如果execve
加载echo
正确,程序的后续部分就不会执行了。
因此,如果结合使用fork()
和execve()
,就是操作系统执行一个新的程序的方式了。
所以每一个子进程都有一个父进程,如果父进程先退出,那么子进程就会被挂在自己父进程的上一级父进程上。如果一个进程挂在init process上,它的生命周期就是在操作系统运行期间保持运行。
关于本文中所讲解的一些概念,还是要仔细阅读apue和tlpi两本书的相关章节进行系统的学习。
- 上一篇 创建基于flask的webapp
- 下一篇 supervisord的安装和使用(一)