《UNP》daemon_init函数

#include "unp.h"
#include 
#define MAXFD 64
extern int daemon_proc;
int
daemon_init(const char *pname, int facility)
{
        int i;
        pid_t pid;
        if((pid=Fork())<0)
                return -1;
        else if(pid)
                _exit(0);//干掉父进程,相当于子进程还活着
        if(setsid()<0) //当前进程变为新会话的会话头进程以及新进程组的进程组头进程,从而不再有控制终端
        Signal(SIGHUP,SIG_IGN);//当会话头进程终止时,其会话中的所有进程都收到SIGHUP信号。所以要忽略掉这个信号。
        if((pid=Fork())<0)//再次fork的目的是确保本守护进程将来即使打开了一个终端设备时,也不会自动获得控制终端
                return -1;
        else if(pid)
                _exit(0);//确保新进程不再是一个会话头进程
        daemon_proc=1;
        chdir("/");//改变当前工作目录
        for(i=0;i

例子

#include "unp.h"
#include 
int
main(int argc,char **argv)
{
        int listenfd,connfd;
        socklen_t addrlen,len;
        struct sockaddr *cliaddr;
        char buff[MAXLINE];
        time_t ticks;
        if(argc<2||argc>3)
                err_quit("usage: daytimetcpsrv2 [  ] ");
        daemon_init(argv[0],0);
        if(argc ==2)
                listenfd=Tcp_listen(NULL,argv[1],&addrlen);
        else
                listenfd=Tcp_listen(argv[1],argv[2],&addrlen);
        cliaddr=Malloc(addrlen);
        for(;;){
                len=addrlen;
                connfd=Accept(listenfd,cliaddr,&len);
                err_msg("connection from %s",Sock_ntop(cliaddr,len));
                ticks=time(NULL);
                snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
                Write(connfd,buff,strlen(buff));
                Close(connfd);
        }
}

结果

image.png

你可能感兴趣的:(《UNP》daemon_init函数)