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可以观察到

posted @ 2015-12-12 21:58  孙悟坑  阅读(374)  评论(0编辑  收藏  举报