Unix网络编程卷一13.4,创建守护进程代码如下:
#include <syslog.h>
#define MAXFD 64
extern int daemon_proc;//定义在其他文件
/*********************************************
* 1.fork()
* 2.setsid()
* 3.signal(SIGHUP,SIG_IGN)
* 4.fork()
* 5.chdir("/")
* 6.close(所有文件描述符)
* 7.dup2()
*
**********************************************/
int daemon_init(const char *pname,int facility)
{
int i;
pid_t pid;
if((pid=fock())<0)
return -1;
else if(pid)
_exit(0);
if(setsid()<0)
return -1;
signal(SIGHUP,SIG_IGN);
if((pid=fork())<0)
return -1;
else if(pid)
_exit(0);
daemon_proc=1;
chdir("/");
for(i=0;i<MAXFD;++i)
close(i);
open("/dev/null",O_RDONLY);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
openlog(pname,LOG_PID,facility);
return 0;
}
主要解释三个open函数是怎么把stdin、stdout、stderr(描述符分别为0、1、2)重定向到/dev/null 的: