欢迎来到天天文库
浏览记录
ID:57687288
大小:15.50 KB
页数:2页
时间:2020-09-01
《C语言守护进程学习笔记.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、/*--------------------------守护进程--精灵进程--Daemon进程初学------------------------------------守护进程是后台服务进程,Linux的部分的服务都是靠他来支持的,为了它不受用户或者终端等其他变化的影响,就要想办法让守护进程低调点创建流程:1.使守护进程忽略信号影响(父进程退出时会给子进程发SIGHCP的信号,对应子进程退出发出SIGCHLD(child)信号)signal(SIGUP,SIG_IGN)(signalup,signalignore)原型sighandler_tsignal(intsignum,sig
2、handler_thandler)2.使守护进程脱离终端控制,不受终端影响。(这里也同时摆脱了原会话和会话组)A用户一登录一个会话就开始了,假设这个会话组有个领头进程PBP---第一次fork---得到子进程P',顺便(exit(0))结束掉领头P的进程<有了第1步骤,父进程退出使不造成影响>,让P‘成为孤儿进程,造成程序已经完毕的假象,摆脱终端影响3.创建新会话,来摆脱原会话控制,当然原进程组合原终端的控制也都摆脱了setsid();这个函数使用后,P'成为新会话组的领头进程了(组长)4.进一步削弱P'(领头进程)的影响,因为如果再打开一个终端的话,将会受到他的直接控制AP'---第
3、二次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;i4、umask(0);C:改变进程中的目录chdir("/")//运行文件的时候要sudoD:对标准IO进程重定向fd=open("/dev/null",O_RDWR);dup2(fd,0);dup2(fd,1);dup2(fd,2)6.这下完成了守护进程的准备功能,想要什么功能自己写。--------------------------------------------------------------------------------------------------------------------*/#include#include5、//signal()#include//fork()setpgrp()sysconf()#include#includeintmain(void){inti,fd;longmax_fd;pid_tpid;charbuf[]="如果你看到这句话,代表本守护进程创建成功";signal(SIGHUP,SIG_IGN);//忽略信号影响signal(SIGTSTP,SIG_IGN);pid=fork();//第一次fork()if(pid>0)exit(0);setsid();//创建新会话组pid=fork();//第二次fork(6、)if(pid>0)exit(0);setpgrp();//摆脱原进程组max_fd=sysconf(_SC_OPEN_MAX);//关闭从父进程继承的一切文件描述符for(i=0;i7、进程创建完毕=============================*/fd=open("hello_daemon",O_RDWR8、O_CREAT,0666);write(fd,buf,strlen(buf));//一定要加sudo来运行本C程序return0;}
4、umask(0);C:改变进程中的目录chdir("/")//运行文件的时候要sudoD:对标准IO进程重定向fd=open("/dev/null",O_RDWR);dup2(fd,0);dup2(fd,1);dup2(fd,2)6.这下完成了守护进程的准备功能,想要什么功能自己写。--------------------------------------------------------------------------------------------------------------------*/#include#include
5、//signal()#include//fork()setpgrp()sysconf()#include#includeintmain(void){inti,fd;longmax_fd;pid_tpid;charbuf[]="如果你看到这句话,代表本守护进程创建成功";signal(SIGHUP,SIG_IGN);//忽略信号影响signal(SIGTSTP,SIG_IGN);pid=fork();//第一次fork()if(pid>0)exit(0);setsid();//创建新会话组pid=fork();//第二次fork(
6、)if(pid>0)exit(0);setpgrp();//摆脱原进程组max_fd=sysconf(_SC_OPEN_MAX);//关闭从父进程继承的一切文件描述符for(i=0;i7、进程创建完毕=============================*/fd=open("hello_daemon",O_RDWR8、O_CREAT,0666);write(fd,buf,strlen(buf));//一定要加sudo来运行本C程序return0;}
7、进程创建完毕=============================*/fd=open("hello_daemon",O_RDWR
8、O_CREAT,0666);write(fd,buf,strlen(buf));//一定要加sudo来运行本C程序return0;}
此文档下载收益归作者所有