守护进程,即通常所说的Daemon进程,是Linux中的后台服务进程,他是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些事的发生。不会因为用户、终端、或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。
怎么创建守护进程1.我们知道子进程运行父进程退出的情况下,子进程会被init收养并转为后台进程,守护进程一般都是授予后台进程,所以第一步就是创建子进程父进程退出,让子进程成为后台进程。
2.利用setsid()创建一个新会话,并让子进程担任会话组组长,让子进程摆脱原会话的控制,让进程摆脱原进程组的控制,让进程摆脱原控制终端你的控制。
3.改变当前目录,因为进程转为守护进程后若还在当前目录所在的文件系统那么有这样的问题,守护进程不受终端控制我们无法关闭它,进程是一直运行的,进程在运行中所在的目录也是无法被 *** 作的,所以为了解决这一问题一般把进程工作目录改成根目录。
4.重设文件掩码,,子进程从父进程继承了文件权限的掩码,这就给该子进程使用的文件带来了一定的影响,因此把文件掩码设置为0可以增强守护进程的灵活性,设置文件掩码的函数式umask(),通常设置为wmask(0)。
5.关闭文件描述符,从父进程继承的打开的文件如果跟随进入守护进程那么和文件目录一样也会无法 *** 作,所以要关闭(一般没有打开文件的程序里只需要关闭sdtin、stdout、stderro即close(1/2/3))。
守护进程获取系统时间并写入文件
#include执行结果#include #include #include #include #include #include int main(){ pid_t pid; pid = fork(); if(pid < 0){ perror("fork"); return 0; } if(pid > 0){ exit(0); } pid = setsid(); chdir("/tmp"); umask(0); int i; FILE *fd; time_t t; for(i = 0;i < 3;i++){ close(i); } fd = fopen("1.log","w+"); if(fd < 0){ perror("fopen"); } while(1){ t = time(NULL); //fputs(ctime(&t),fd); fprintf(fd,"%sn",ctime(&t)); fflush(fd); sleep(1); } }
由于是守护进程,所以执行之后终端是没有反应的。
写入的文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)