最近在学习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可以观察到
Linux的进程组、会话、守护进程:http://www.linuxdiyf.com/linux/10578.html
Linux下的守护进程:http://www.linuxdiyf.com/linux/8213.html
100个最常见Linux守护进程简介:http://www.linuxdiyf.com/linux/861.html