1 守护进程
要了解什么是守护进程要先知道什么是孤儿进程
1.1 孤儿进程
父进程运行结束,但子进程未运行结束的子进程。然后子进程会被寄养到其他进程下
1.2 守护进程
特殊的孤儿进程,这种进程脱离终端,在后台运行。
1.3 使用场景
搭建服务器或者服务程序时
1.4 搭建守护流程
-
创建子进程,杀死父进程(父进程退出)
fork,if pid > 0,exit
-
设置子进程为会话组组长
setsid
// 头文件 #include <unistd.h> // 函数格式 pid_t setsid(void); /* * 功能: * 创建新会话,设置调用进程为新会话组长 * 参数: * void * 返回值: * 成功返回SID,失败返回-1 */
-
更改工作路径为根目录
chdir
// 头文件 #include <unistd.h> // 函数格式 int chdir(const char *path); /* * 功能: * 更改进程的工作路径 * 参数: * 新的工作路径的首地址 * 返回值: * 成功返回0,失败返回-1 */
-
修改文件权限掩码
umask
// 头文件 #include <sys/types.h> #include <sys/stat.h> // 函数格式 mode_t umask(mode_t mask); /* * 功能: * 修改文件权限掩码 * 参数: * 文件权限掩码 * 返回值: * 成功返回之前的掩码值 * * 注意: * 真正的文件权限 = mode & ~umask */
-
关闭从父进程拷贝过来的多余的文件描述符
getdtablesize close
// 头文件 #include <unistd.h> // 函数格式 int getdtablesize(void); /* * 功能: * 获取当前进程文件描述列表的大小 * 参数: * void * 返回值: * 成功返回该进程的文件描述符的最大值 */
1.5 具体案例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
// 创建子进程
pid_t pid = fork();
if(pid > 0)
{
// 杀死父进程
exit(0);
}
else if(0 == pid)
{
// 设置子进程为会话组组长
setsid();
// 更改工作路径为根目录
chdir("/");
// 修改文件权限掩码
umask(0077);
int size = getdtablesize();
int i = 0;
for(i = 3; i < size; i++)
{
// 关闭从父进程拷贝过来的多余的文件描述符
close(i);
}
// 获取时间并写入到文件中
int fd = open("mylog", O_CREAT | O_WRONLY, 0664);
while(1)
{
time_t ti;
sleep(10);
ti = time(&ti);
char *p = ctime(&ti);
write(fd, p, strlen(p));
}
close(fd);
}
return 0;
}
执行程序
结果