‘daemon_init’ Function
Figure 13.4 shows a function named daemon_init that we can call (normally from a server) to daemonize the process. This function should be suitable for use on all variants of Unix, but some offer a C library function called daemon that provides similar features. BSD offers the daemon function, as does Linux.
#include "unp.h"
#include <syslog.h>
#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)
return 0;
if(setsid()<0)
return -1;
Signal(SIGHUP, SIG_IGN);
if((pid=Fork())<0)
return -1;
else if(pid)
return 0;
chdir("/");
for(i=0;i<MAXFD;i++)
close(i);
open("/dev/null", O_RDNOLY);
open("/dev/null", O_RDWR);
opne("/dev/null", O_RDWR);
openlog(pname, LOG_PID, facility);
return 0;
}
daemon_init function: daemonizes the process
Daytime Server as a Daemon
#include "unp.h"
#include <time.h>
int main(const char *pname, int facility)
{
int listenfd, connfd;
socklen_t addrlen, len;
struct sockaddr *clientaddr;
char buff[MAXLINE];
time_t ticks;
if(argc<2||argc>3)
err_quit("usage: daytimetcpserver2 [ <host> ] <service or port>");
daemon_init(argc[0],0);
if(argc==2)
listenfd=Tcp_listen(NULL, argv[1], &addrlen);
else
listenfd=Tcp_listen(argv[1], argv[2], &addrlen);
clientaddr=Malloc(addrlen);
for(;;){
len=addrlen;
connfd=Accept(listenfd, clientaddr, &len);
err_msg("connection from %s", Sock_ntop(clientaddr, len));
ticks=time(NULL);
snprintf(buff, sizeof(buff), "%.24s/r/n", ctime(&ticks));
Write(connfd, buff, strlen(buff));
Close(connfd);
}
return 0;
}
Protocol-independent daytime server that runs as a daemon