void init_daemon(void) { int pid; int i;
if((pid=fork())>0) exit(0);//是父进程,结束父进程
else if(pid< 0) exit(1);//fork失败,退出
//是第一子进程,后台继续执行
//setsid();//第一子进程成为新的会话组长和进程组长
if(setsid()<0) exit(1); //并与控制终端分离
if((pid=fork())) exit(0);//是第一子进程,结束第一子进程
else if(pid< 0) exit(1);//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
for(i=0;i<NOFILE;++i)//关闭打开的文件描述符
close(i); chdir("./");//改变工作目录到/tmp
umask(0);//重设文件创建掩模
open("/dev/null",O_RDWR); dup(1); dup(2); return; }
|
一定记得
open("/dev/null",O_RDWR);
dup(1);
dup(2);
否则会出现 意想不到的结果1
阅读(1462) | 评论(0) | 转发(0) |