linux下创建守护进程,在Linux中创建守护进程

334fb4341ad3f3cf13c148639fb3e12d.png

慕的地10843

你不能在linux中创建一个无法杀死的进程。root用户(uid = 0)可以向进程发送信号,并且有两个信号无法捕获,SIGKILL = 9,SIGSTOP = 19。其他信号(未被捕获时)也可能导致进程终止。您可能需要一个更通用的守护进程函数,您可以在其中指定程序/守护程序的名称,以及运行程序的路径(可能是“/”或“/ tmp”)。您可能还想为stderr和stdout(以及可能使用stdin的控制路径)提供文件。以下是必要的包括:#include     //printf(3)#include    //exit(3)#include    //fork(3), chdir(3), sysconf(3)#include    //signal(3)#include //umask(3)#include    //syslog(3), openlog(3), closelog(3)这是一个更通用的功能,intdaemonize(char* name, char* path, char* outfile, char* errfile, char* infile ){    if(!path) { path="/"; }    if(!name) { name="medaemon"; }    if(!infile) { infile="/dev/null"; }    if(!outfile) { outfile="/dev/null"; }    if(!errfile) { errfile="/dev/null"; }    //printf("%s %s %s %s\n",name,path,outfile,infile);    pid_t child;    //fork, detach from process group leader    if( (child=fork())<0 ) { //failed fork        fprintf(stderr,"error: failed fork\n");        exit(EXIT_FAILURE);    }    if (child>0) { //parent        exit(EXIT_SUCCESS);    }    if( setsid()<0 ) { //failed to become session leader        fprintf(stderr,"error: failed setsid\n");        exit(EXIT_FAILURE);    }    //catch/ignore signals    signal(SIGCHLD,SIG_IGN);    signal(SIGHUP,SIG_IGN);    //fork second time    if ( (child=fork())<0) { //failed fork        fprintf(stderr,"error: failed fork\n");        exit(EXIT_FAILURE);    }    if( child>0 ) { //parent        exit(EXIT_SUCCESS);    }    //new file permissions    umask(0);    //change to path directory    chdir(path);    //Close all open file descriptors    int fd;    for( fd=sysconf(_SC_OPEN_MAX); fd>0; --fd )    {        close(fd);    }    //reopen stdin, stdout, stderr    stdin=fopen(infile,"r");   //fd=0    stdout=fopen(outfile,"w+");  //fd=1    stderr=fopen(errfile,"w+");  //fd=2    //open syslog    openlog(name,LOG_PID,LOG_DAEMON);    return(0);}这是一个示例程序,它成为守护进程,挂起,然后离开。intmain(){    int res;    int ttl=120;    int delay=5;    if( (res=daemonize("mydaemon","/tmp",NULL,NULL,NULL)) != 0 ) {        fprintf(stderr,"error: daemonize failed\n");        exit(EXIT_FAILURE);    }    while( ttl>0 ) {        //daemon code here        syslog(LOG_NOTICE,"daemon ttl %d",ttl);        sleep(delay);        ttl-=delay;    }    syslog(LOG_NOTICE,"daemon ttl expired");    closelog();    return(EXIT_SUCCESS);}请注意,SIG_IGN表示捕获并忽略该信号。您可以构建一个可以记录信号接收的信号处理程序,并设置标志(例如标志以指示正常关闭)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值