守护进程
所谓守护进程就是7*24小时一直运行在服务器端不受登录、注销影响。也称精灵进程。
守护进程自成组自成会话。
这里有一点需要说明,后台作业并非守护进程,后台进程是指会话内部的作业,当关闭会话时会话内部所有后台作业都会结束而守护进程自成会话,所以不受影响。
**创建**一个守护进程需要调用setsid命令,但这条命令不能由该组组长调用,所以在创建后台进程时应先fork子进程,然后让子进程调用setsid。
守护进程代码示例如下:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<signal.h>
5
6 void mydaemon()
7 {
8 umask(0);
9 if(fork() > 0){
10 exit(0);
11 }
12 setsid();
13 chdir("/");
14 close(0);
15 close(1);
16 close(2);
17 signal(SIGCHLD, SIG_IGN);
18 }
19 int main()
20 {
21 mydaemon();
22 return 0;
23 }
创建守护进程时应注意:
1.调用umask将文件模式创建屏蔽字设置为0。
2.调用fork,父进程退出exit。
3.调用setsid创建一个新会话。
setsid会导致:
1)调用进程成为新会话首进程。
2)调用进程成为一个进程组的组长进程。
3)调用进程没有控制终端。
4.将当前工作目录更改为根目录。
5.关闭不再需要的文件描述符。
6.其他:忽略SIGCHID信号。
再创建守护进程的时候有人fork两次,是因为在调用完setsid后,再次fork一次,保证daemon进程,之后不会打开tty设备。