linux c创建守护进程

2021-08-06  本文已影响0人  一路向后

1.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <signal.h>
#include <time.h>
#include <syslog.h>

int init_daemon(void)
{
    int pid;
    int i;

    //忽略终端I/O信号, STOP信号
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP, SIG_IGN);

    pid = fork();
    if(pid > 0)
    {
        //结束父进程, 使得子进程成为后台进程
        exit(0);
    }
    else if(pid < 0)
    {
        return -1;
    }

    //建立一个新的进程组
    setsid();

    pid = fork();
    if(pid > 0)
    {
        //保证该进程不是进程组长, 同时让该进程无法再打开一个新的终端
        exit(0);
    }
    else if(pid < 0)
    {
        return -1;
    }

    //关闭所有父子进程继承的不再需要的文件描述符
    for(i=0; i<NOFILE; close(i++));

    //改变工作目录
    chdir("/");

    //将文件当时创建屏蔽字设置为0
    umask(0000);

    //忽略SIGCHLD信号
    signal(SIGCHLD, SIG_IGN);

    return 0;
}

int main()
{
    time_t now;

    init_daemon();

    syslog(LOG_USER|LOG_INFO, "Test Daemon Process!");

    while(1)
    {
        sleep(8);

        time(&now);

        syslog(LOG_USER|LOG_INFO, "System: %s", ctime(&now));
    }

    return 0;
}

2.编译源码

$ gcc -o daemon daemon.c -std=c99

3.运行及其结果

$ ./daemon
$ ps -ef | grep daemon
helen       1616      1  0 22:19 ?        00:00:00 ./daemon
helen       1634   1475  0 22:22 pts/0    00:00:00 grep --color=auto daemon
上一篇 下一篇

猜你喜欢

热点阅读