守护进程也称精灵进程(Daemon),是运⾏在后台的一种特殊进程。它独⽴立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它自成进程组,自成绘画,不受用户登录注销的影响。凡是TPGID⼀栏写着-1的都是没有控制终端的进程,也就是守护进程
创建一个守护进程需要调用setsid()函数:该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进 程组的Leader也很容易,只要先fork再调⽤用setsid就⾏了。fork创建的子进程和父进程在同一个进 程组中,进程组的Leader必然是该组的第⼀个进程,所以子进程不可能是该组的第一个进程,在子 进程中调⽤用setsid就不会有问题了。
成功调⽤用该函数的结果是:
1. 创建⼀个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
2. 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。
3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是⼀个普通的打开文件而不是控制终端了。
创建守护进程的步骤如下:
1、 调⽤用umask将⽂文件模式创建屏蔽字设置为0;
2、调⽤用fork,⽗父进程退出(exit);
3、在子进程中调用setsid()函数;
4、将当前⼯工作⽬目录更改为根⽬目录。
5、关闭不在需要的⽂文件描述符。
6、忽略SIGCHLD信号。
代码如下: