守护进程实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/stat.h>
#include<fcntl.h>
// 创建守护进程
int ngx_daemon()
{
int fd;
switch(fork())
{
case -1:
// failed
return -1;
case 0:
// child process
break;
default:
// parent process
exit(0);
}
if(setsid() == -1) //脱离终端
{
// failed
return -1;
}
umask(0);
fd = open("/dev/null", O_RDWR);
if(-1 == fd)
{
// failed
return -1;
}
if(-1 == dup2(fd, STDIN_FILENO))
{
// failed
return -1;
}
if(-1 == dup2(fd, STDOUT_FILENO))
{
// failed
return -1;
}
if(fd > STDERR_FILENO)
{
if(-1 == close(fd))
{
//failed
return -1;
}
}
return 1;
}
int main(int argc, char * const * argv)
{
if(ngx_daemon() != 1)
{
return 1;
}
else
{
for(;;)
{
sleep(1);
printf("sleep 1s, PID = %d !\n", getpid());
}
}
return 0;
}
守护进程不会收到的信号:
- SIGHUP,连接(终端)断开信号。如果终端检测到一个连接断开时,会发送此信号给该终端所在的会话首进程。
- SIGINT,终端中断符,按Ctrl+C产生该信号。
- SIGWINCH,终端窗口大小改变信号。
这些信号都可以拿来自用,作为和守护进程通信的手段。