编写守护进程的基本步骤

本文基址:http://blog.csdn.net/cugxueyu/archive/2007/12/13/1932771.aspx


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

#define daemon_main main

int  daemon_main( int  argc,  char   * argv[])
{
    
int        fd_index, fdtablesize;
    pid_t    pid;
    pid_t    child_pid;
        
    
/*@1 Ignore SIGTTOU, SIGTTIN, SIGTSTP, SIGHUP */
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP,  SIG_IGN);

    
if ((pid = fork()) < 0{
        (
void)printf("parent fork error... ");    
        exit(
1);
    }


    
/*@2 parent exit */
    
if (pid > 0) exit(0);
    
    
/*@3 child process */
    
if (pid == 0{
        
/*@4 create session and set process group ID */
        
if (setsid() < 0{
            (
void)printf("setsid error... ");
            exit(
1);
        }

    }


    
/*@5 grandchild process */
    
if ((child_pid = fork()) < 0{
        (
void)printf("child fork error... ");
        exit(
1);
    }

    
    
/*@6 child process exit */
    
if (child_pid > 0{
        exit(
0);
    }


    
/*@7 close file descriptor */
    fdtablesize 
= getdtablesize();
    
for(fd_index = 0; fd_index < fdtablesize; fd_index++{
        close(fd_index);
    }


    
/*@8 choose work directory */
    
if (chdir("/tmp"< 0{
        (
void)printf("chdir error... ");
        exit(
1);
    }


    
/*@9 reset umask */
    umask(
0);

    
/*@10 ignore SIGCHLD */
    signal(SIGCHLD, SIG_IGN);

    
/*@11 open syslog test daemon */
    FILE 
*fp = fopen("/tmp/syslog""w");
    fputs(
"Daemon syslog testing... ", fp);
    
//syslog(LOG_USER | LOG_INFO, "Daemon syslog testing... ");
    while(1{        
        time_t now;
        time(
&now);
        
//syslog(LOG_USER | LOG_INFO, "Current time: %s ", ctime(&now));
        (void)fprintf(fp, "Current time: %s ", ctime(&now));
        fflush(fp);
        sleep(
5);
    }

    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值