您的当前位置:首页正文

C语言守护进程学习笔记

来源:个人技术集锦
/*--------------------------守护进程--精灵进程--Daemon进程初学------------------------------------ 守护进程是后台服务进程,Linux的部分的服务都是靠他来支持的,为了它不受用户或者终端等其他变化的影响,就要想办法让守护进程低调点 创建流程:

1.使守护进程忽略信号影响(父进程退出时会给子进程发SIGHCP的信号,对应子进程退出发出SIGCHLD(child)信号)

signal(SIGUP, SIG_IGN)(signal up, signal ignore) 原型sighandler_t signal(int signum, sighandler_t handler)

2.使守护进程脱离终端控制,不受终端影响。(这里也同时摆脱了原会话和会话组) A 用户一登录一个会话就开始了,假设这个会话组有个领头进程P

B P ---第一次fork---得到子进程P',顺便(exit(0))结束掉领头P的进程<有了第1步骤,父进程退出使不造成影响>,

让P‘成为孤儿进程,造成程序已经完毕的假象,摆脱终端影响

3.创建新会话,来摆脱原会话控制,当然原进程组合原终端的控制也都摆脱了 setsid();这个函数使用后,P'成为新会话组的领头进程了(组长)

4.进一步削弱 P'(领头进程)的影响,因为如果再打开一个终端的话,将会受到他的直接控制

A P' ---第二次fork---得到P”,为了继续摆脱终端的影响,紧接着再(exit(0)) 结束掉组长的进程

B 此时进程P\"还差摆脱进程组的控制,就可以成为守护进程了。所以 setpgrp(),成为新组的组长了,P“成为守护进程了 PS:P->P’->P'' 的步骤都是为了摆脱A会话和会话组B控制终端和C进程组的影响,成为一个独立的不受影响的后台服务进程

5.剩下的工作就是对守护进程的细节的处理了,就是为了摆脱父亲的控制

A:关闭从父进程继承的一切文件描述符(固定格式:max_fd = sysconf(_SC_OPEN_MAX);for(i=0;iC:改变进程中的目录 chdir(\"/\")//运行文件的时候要sudo D:对标准IO进程重定向 fd = open(\"/dev/null\6.这下完成了守护进程的准备功能,想要什么功能自己写。

--------------------------------------------------------------------------------------------------------------------*/ #include

#include //signal()

#include //fork() setpgrp() sysconf() #include #include

int main(void) { int i, fd; long max_fd; pid_t pid; char buf[] = \"如果你看到这句话,代表本守护进程创建成功\";

signal(SIGHUP, SIG_IGN);//忽略信号影响 signal(SIGTSTP, SIG_IGN); pid = fork();//第一次fork() if(pid > 0) exit(0); setsid();//创建新会话组 pid = fork();//第二次fork() if(pid > 0) exit(0); setpgrp();//摆脱原进程组 max_fd = sysconf(_SC_OPEN_MAX);//关闭从父进程继承的一切文件描述符 for(i=0; i/*=======================守护进程创建完毕=============================*/ fd = open(\"hello_daemon\T, 0666); write(fd, buf, strlen(buf));

//一定要加sudo 来运行本C程序 return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容