1、什么是守护进程?
守护进程—守护进程运行在后台,不跟任何控制终端关联。
2.怎么创建一个守护进程?
有两个基本要求:
a.守护进程必须作为 init 进程的子进程
b.守护进程不跟控制终端交互。
创建守护进程的步骤:
1.使用 fork 函数创建一个新的进程,然后让父进程使用 exit 函数直接退出(必须要的)
2.调用 setsid 函数。(必须要的)
调用setsid函数来比摆脱原来进程组的控制,摆脱原来的控制终端的控制。
3.调用 chdir 函数,将当前的工作目录改成根目录,增强程序的健壮性。(不是必须要的)
4.重设我们 umask 文件掩码,增强程序的健壮性和灵活性(不是必须要的)
5.关闭文件描述符,节省资源(不是必须要的)
6.执行我们需要执行的代码(必须要的)
步骤1,2,6均为必要步骤。
补充:进程组与会话的概念
3、创建守护进程测试代码
根据创建守护进程自己创建一个守护进程,c代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{
pid_t pid; // 步骤一:创建一个新的进程
pid = fork(); //父进程直接退出
if (pid > 0)
{
exit(0);
}
if (pid == 0)
{
// 步骤二:调用 setsid 函数摆脱控制终端
setsid(); // 步骤三:更改工作目录 ,此处将工作目录改为了根目录
chdir("/");
// 步骤四:重新设置 umask 文件源码 ,此时需要包含两个头文件,且将umask的值写为0(这里umask的值可以随意设置)
umask(0); // 步骤五:0 1 2 三个文件描述符
close(1);
close(2);
close(3); // 步骤六:执行我们要执行的代码 ,这里使用while循环
while (1) {}
}
return 0;
}
在ubuntu界面的运行结果如下:
在编译结束显示没有问题之后,开始执行该守护进程的可执行文件,此时终端是没有被占用的。由于创建的是守护进程,守护进程是在后台运行的,是不与控制终端关联的。所以说控制终端虽然可以用,但是“shouhu”进程是一直在后台运行的。在ubuntu界面使用管道命令查看,可以看到创建的守护进程正在运行,守护进程的创建是成功的。