Linux系统编程——守护进程
Linux系统编程——守护进程
守护进程
守护进程也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存周期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些事件。
守护进程常常在系统启动后,开始运行,在系统关闭时终止。
Linux系统常常有很多守护进程,大多数服务都是由守护进程实现的。
守护进程编写步骤
- 创建子进程,父进程退出,通过fork实现
- 在子进程中创建新会话,通过setsid实现
- 改变当前目录为根目录,通过chdir实现
- 重设文件权限掩码,通过umask实现
- 关闭文件描述符,通过close实现
创建新会话函数
pid_t setsid(void)
所需头文件:sys/types.h、unistd.h
功能:创建新会话,并使得当前进程成为新会话组的组长。
返回值:成功返回新的会话的id,失败返回-1并设置errno。
注意事项:
setsid函数能够使进程完全独立出来,从而脱离h所有其它进程的控制。
修改当前目录
int chdir(const char* path);
所需头文件:unistd.h
功能:修改当前目录为path指定的目录
path:目录路径
返回值:成功返回0,失败返回-1并设置errno。
重设文件权限掩码
mode_t umask(mode_t mask);
所需头文件:sys/types.h、sys/stat.h
功能:修改创建文件时文件权限的掩码
mask:新掩码
返回值:总是成功,几乎不会出错。
实例:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>int main(){pid_t pid;pid = fork();if (pid < 0) {printf("Fork Failed\n");exit(1);} else if (fork == 0) {int i;setsid(); //创建新会话chdir("/"); //改变工作目录到根目录umask(0); //重设文件权限掩码for(i = 0; i < getdtablesize(); ++i)close(i); //关闭所有打开的文件描符while (1);} else {exit(0); //父进程退出}
}
执行结果:

