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)执行完没有结果说明正确,如下图。
2)使用ps ajx(建议)或者平时aux查看,可以知道它正在运行并且脱离了终端(有问号嘛),最明显的标志就是:我们在程序中使用了while,但是终端并没有卡主而且我们还能输入了ps ajx命令,说明它确实脱离了终端控制。
3)不受用户注销的影响
注销后重新登录用户输入ps ajx命令查看:
可以看到仍然在后台运行,并且已经执行7分多钟,因为我去刷牙了,一giao我里giaogiao。4)由于它是多余的,所以根据上面的pid把它给干掉。
5)可以看到没有在在找到该守护进程了,注意下面的红色的那行是由于grep命令造成的,并不是该守护进程,具体你可以使用ps ajx去掉grep命令去一个个看,确实是没有该守护进程的,只不过麻烦了点。
好了,守护进程的学习就是这三篇,到此结束。