linux下守护进程的创建
最近在学习linux c编程
看到了守护进程的创建,感觉很好玩,
测试环境ubuntu 15.04
下面贴出测试代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/param.h> #include <sys/stat.h> #include <time.h> #include <syslog.h> int init_pro( void ) { int pid; //进程号 int i; /*忽略终端io信号,stop信号*/ signal( SIGTTOU, SIG_IGN ); signal( SIGTTIN, SIG_IGN ); signal( SIGTSTP, SIG_IGN ); signal( SIGHUP, SIG_IGN ); /*在当前进程下开启一个新的进程*/ pid = fork(); //如果pid>0返回的是父进程的进程id,结束掉父进程 if ( pid > 0 ) { exit(0); //结束父进程,使得子进程成为后台进程 } else //如果pid小于0开启子进程失败,返回 if ( pid < 0 ) { return -1; } //建立一个新的进程组,在这个新的进程组里面,子进程成为这个进程的首进程,已使该进程脱离所有终端 setsid(); //再次通过fork建立一个新的子进程,即在刚才建立的子进程之下建立一个新的子进程 //目的是保证该进程不是进程组长,同时让该进程无法再打开一个终端 pid = fork(); if ( pid > 0 ) { exit(0); //如果返回的是父进程(即之前的子进程)的pid那么结束这个进程 } else if ( pid < 0 ) { return -1; } //什么是NOFILE //关闭所有从父进程继承的不在需要的文件描述符 //什么是文件描述符 for( i = 0; i < NOFILE; close(i++) ); //改变工作目录,使得进程不与任何文件系统联系 //到这里其实只剩下最后一次开启的子进程了 chdir("/"); //将文件屏蔽字设为0 umask(0); //忽略sigchld信号 signal(SIGCHLD, SIG_IGN); return 0; } int main(int argc, char **argv) { time_t now; init_pro(); syslog(LOG_USER|LOG_INFO, "测试守护进程!\n"); while (1) { /* code */ sleep(8); time(&now); syslog(LOG_USER|LOG_INFO, "系统时间:\t%s\t\t\n", ctime(&now)); } }
注意,在使用syslog之前,首先需要配置/etc/rsyslog.conf文件,在该文件最后添加user*/var/log/test.log
然后重新启动rsyslog服务
编译运行
我们打开test.log会发现每隔8秒他就回计时一次
使用ps -ef可以观察到