#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