守护(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。其没有控制终端,不能直接和用户交互,不受用户登录、注销的影响。
创建过程如下:
- 创建子进程,父进程退出,脱离控制终端;
- 子进程中创建新会话,这个步骤是创建守护进程中最重要的一步,在这里使用的是系统函数setsid。
setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid的三个作用:让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制; - 改变当前工作目录为非挂载目录,用chdir()函数,其目的是为了防止占用挂载目录;
- 重设文件权限掩码,用umask()函数;
- 关闭文件描述符,继承的打开文件不会用到,浪费系统资源,无法卸载,如fd[0](标准输入),fd[1](标准输出),fd[2](标准错误输出),因为守护进程无用户交互过程,所以可以关闭这些描述符。
代码如下:
#include#include #include #include #include int main(void) { pid_t f_pid = fork(); if (f_pid < 0) { return -1; } else if (f_pid!= 0) { return 0; } setsid(); if (chdir("/") < 0) { return -1; } umask(0); close(0); int fd = open("/dev/null", O_RDWR); dup2(fd , 1); dup2(fd , 2); do { //守护进程业务 }while(1); }



