1. 精灵进程的定义
让进程摆脱原会话的控制;
让进程摆脱原进程组的控制;
让进程摆脱原控制终端的控制;
总之,就是让调用进程完全独立出来,脱离所有其他进程的控制。
简单的后台执行时,虽然不再接收终端产生的SIGINT、SIGQUIT信号,
但是shell终止时会给终端对应的进程组发送SIGHUP信号。(例如按&来执行一个程序的话,当关闭console的时候,这个程序也会关闭)
精灵进程会调用setsid脱离控制终端,即没有控制终端
2. 进程ID,进程父ID,进程组ID,进程会话ID的理解
PID:进程ID,唯一标示此进程
PPID:父进程ID,产生此进程的上一级进程
PGID:进程组ID。每个进程都属于一个进程组。可以通过getpgid和setpgid这个两个API来进行获取和设置进程组ID。每个进程组有一个组长进程。组长进程的进程ID等于进程组ID。信号可以发送给一个进程,也可以发送给一个进程组的所有进程。
SID:对话期ID。
对话期是一个或多个进程组的集合。非进程组组长进程调用setsid API将创建一个新的会话。如果进程组组长进程调用setsid,则出错。登陆一次shell产生的进程组为一个对话。
会话与控制终端:
(1) 一个对话期可以有一个单独的控制终端。这通常是我们在其上登陆上的终端设备。
(2) 建立与控制终端连接的对话期首进程,称之为控制进程。
(3) 一个对话期中的几个进程组可被分为一个前台进程组以及一个或几个后台进程组
(4) 如果一个对话期有一个控制终端,则仅有一个前台进程组,其他进程组则为后台进程组。
(5) 无论合适键入中断键,就会造成将中断信号或退出信号送至前台进程组的所有进程。
TPGID:终端进程组ID。
进程并没有终端进程组关联,进程属于一个进程组,而进程组属于一个对话期,对话期可能有,也可能没有控制终端,如果其确实有一个控制终端,则此终端设备知道其前台进程的进程组ID,此值可以通过tcgetpgrp来获取。
上述所有ID ,可以通过ps –jx来获取。
3. 精灵进程的特征
(1)精灵进程控制终端名称均为?,终端前台进程组ID设置为-1,也就是说没有控制终端。
(2)精灵进程一般是会话期和进程组的首进程,也是会话期和进程组中的唯一进程
(3)精灵进程的父进程都是init进程
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 1913 1913 1913 ? -1 Ss 0 0:00 syslogd -m 0 |
符合条件1,TTY为?,TPGID为-1
符合条件2,进程ID与会话期ID和进程组ID相同
符合条件3,父进程是init,也就是1
4. 精灵进程的实现
(1) 调用fork,使父进程exit
a) 如果此精灵进程是由一个shell发起,则父进程的终止会使shell命令完成
b) 子进程继承了父进程的组ID,但具有一个新的进程ID,这就保证了子进程不是一个进程组的首进程。这样才能调用setsid。
(2) 调用setsid以创建一个新对话期
a) 成为新对话期的首进程
b) 成为新进程组的首进程
c) 没有控制终端(父进程才是与控制终端关联的对话期首进程,也就是是控制进程,所以子进程没有控制终端)
(3) 将当前目录更改为根目录。避免从父进程继承了目录的某些权限特性
(4) 将文件方式创建屏蔽字设置为0.避免从父进程集成了文件的某些权限特性
(5) 关闭不再需要的文件描述符。避免从父进程继承了文件描述符。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>
int main() { #if 1 pid_t pid;
if( (pid = fork()) < 0 ) return -1; else if( pid != 0) exit(0);
setsid(); chdir("/"); umask(0); #endif //child process procedure sleep(1000000000); return 0; } |
[nick@d01 fairyprocess]$ ps -ajx | grep -E "main|PPID" Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 15305 15305 15305 ? -1 Ss 521 0:00 ./main 15168 15307 15306 15168 pts/17 15306 S+ 521 0:00 grep -E main|PPID |
符合精灵进程的三个条件。