守护进程
在Linux下,守护进程也叫精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期的执行某种任务或等待处理某些发生的事件,守护进程是一种很有用的进程。Linux 的大多数服务器就是用守护进程实现的,比如Internet服务器inetd,Web服务器httpd等。同时,守护进程完成很多系统任务,比如作业进程规划进程crond等。
如何创建守护进程?
1.调用umask将文件模式创建屏蔽字设置为0;
2.调用fork,父进程退出。这样操作的原因是让父进程终止,使shell认为该命令已经执行完毕;并且保证了子进程不是一个进程组的组长进程。
3.调用setsid创建一个新会话。此举调用进程使调用进程成为新会话的首进程;成为了进程组的组长进程,且没有控制终端。
4.将当前工作目录更改为根目录。
5.关闭不再需要的文件描述符。
6.忽略SIGHLD信号。
创建守护进程最关键的步骤是第三步,调用setid函数创建一个新的session,并成为组长。(session leader)
代码如下:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
void creat_Daemon(void)
{
int i;
int fd0;
pid_t pid;
struct sigaction sa;
umask(0);
if(pid=fork()<0)
{
}
else if(pid !=0)
{
exit(0);
}
setsid();
sa.sa_handler=SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags=0;
if(sigaction(SIGCHLD,&sa,NULL)<0)
{
return;
}
if(pid=fork()<0)
{
printf("fork error!\n");
return;
}
else if(pid != 0)
{
exit(0);
}
if(chdir("/")<0)
{
printf("child dir error\n");
return;
}
close(0);
fd0=open("/dev/null",O_RDWR);
dup2(fd0,1);
dup2(fd0,2);
}
int main()
{
creat_Daemon();
while(1)
{
sleep(1);
}
}
有的人在创建进程时会fork两次,这样做是为了防止出现僵尸进程。