03守护进程学习之创建守护进程的代码例子

1 守护进程的例子

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

void mydaemond(void){
	
	//1 创建子进程,父进程退出
    pid_t pid = fork();
    if (pid > 0) {
        exit(0);
    }

	//2 在子进程中创建新会话
    setsid();

	//3 改变当前工作目录
    int ret = chdir("/home/itcast/");
    if (ret == -1) {
        perror("chdir error");  // chdir error no such diractroy or file
        exit(1);
    }
	
	//4 重设文件权限掩码
    umask(0022);

	//5 关闭文件描述符
    close(STDIN_FILENO);
    open("/dev/null", O_RDWR);
    dup2(0, STDOUT_FILENO);
    dup2(0, STDERR_FILENO);
}

int main(void){
	
    mydaemond();
	
	//6 开始执行守护进程核心工作
    while (1) {
    }

	//7 守护进程退出处理程序模型(实际上对于守护进程的管理或者退出都是使用脚本语言来管理的,一般不需要在代码中处理。)
    return 0;
}

以上例子步骤不是太熟的话可以看我上一篇的七步骤。

2 结果分析

1)执行完没有结果说明正确,如下图。

守护进程启动 java 守护进程代码_守护进程启动 java


2)使用ps ajx(建议)或者平时aux查看,可以知道它正在运行并且脱离了终端(有问号嘛),最明显的标志就是:我们在程序中使用了while,但是终端并没有卡主而且我们还能输入了ps ajx命令,说明它确实脱离了终端控制。

守护进程启动 java 守护进程代码_linux_02


3)不受用户注销的影响

守护进程启动 java 守护进程代码_子进程_03


注销后重新登录用户输入ps ajx命令查看:

守护进程启动 java 守护进程代码_子进程_04


可以看到仍然在后台运行,并且已经执行7分多钟,因为我去刷牙了,一giao我里giaogiao。4)由于它是多余的,所以根据上面的pid把它给干掉。

守护进程启动 java 守护进程代码_守护进程_05


5)可以看到没有在在找到该守护进程了,注意下面的红色的那行是由于grep命令造成的,并不是该守护进程,具体你可以使用ps ajx去掉grep命令去一个个看,确实是没有该守护进程的,只不过麻烦了点。

守护进程启动 java 守护进程代码_linux_06

好了,守护进程的学习就是这三篇,到此结束。