int daemon_init(void)
{
int max_fd, ret;
int iRet;
struct sigaction act;
int i;
if ((iRet = fork()) < 0)
{
printf("创建守护进程错误!\n");
_exit(4);
}
else if (iRet != 0)
{
_exit(0);
}
else if (setsid() < 0)//创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。
{
_exit(5);
}
/*忽略父进程退出信号*/
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
//函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号。
act.sa_flags = 0;
sigaction(SIGHUP, &act, NULL);
//sigaction函数可以读取和修改与指定信号相关联的处理动作。
if ((ret = fork()) < 0)
{
_exit(4);
}
else if (ret != 0)
{
_exit(0);
}
/*改变进程工作路径*/
/*printf("pub74\n");*/
/*chdir("/");*/
/*printf("pub76\n");*/
umask(0);
setpgrp();
/* open("dev/null",O_RDWR);*/
/*dup(1);
dup(2);*/dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。
signal(SIGCHLD, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
/*设置信号,父进程不预回收子进程信息,防止产生僵死进程*/
/*信号 SIGCHLD 的信号定位为 SIG_IGN,则调用进程的子进程在终
止时不会变成僵死进程.调用进程也不用等待子进程返回并做相
应处理.
add:如果一个进程已经终止,但是它的父进程尚未调用wait或waitpid对它进行清理,这时的进程状态称为僵尸(Zombie)进程 */
return 0;
}
没有评论:
发表评论