会话期、进程组、守护进程关系图
守护进程的tty是?
创建守护进程的步骤
(1)fork一个进程,并结束父进程
(2)在子进程中调用setsid函数,创建新的会话期(此时子进程是新会话期的首进程,子进程也是该首进程组组长)
(3)调用chdir函数,让根目录“/”成为子进程的工作目录
(4)关闭标准输入标准输出标准错误
(5)重定向stdin,stdout,stderr
代码
void mydaemon()
{
pid_t pid;
pid = fork();
if(pid == -1)
{
perror("fork");
exit(0);
}
if(pid == 0) exit(0);//关闭父进程
pid = setsid(); //run a program in a new session 创建新会话期
if(pid == -1)
{
perror("setsid");
exit(0);
}
chdir("/"); //更改子进程的工作目录为根目录,防止删除的时候删除不了目录
for(int i = 0; i < 3; i++) close(i); //关闭文件描述符
open("/dev/null", O_RDWR); //将0文件描述符定到/dev/null
dup(0); //将1文件描述符定到/dev/null
dup(0); //将2文件描述符定到/dev/null
}
daemon函数
daemon函数功能和上面mydaemon类似
int daemon(int nochdir, int noclose);
当nochdir为1(非0)时,改变工作目录到根目录
当noclose为1(非0)时,重导向stdin,stdout,sterr到/dev/null