如何检查一个进程所关联的终端设备? (linux 系统下)
最近在阅读 apue , 关于进程的终端设备一直没有搞明白。为了创建一个守护进程,我首先要fork ,然后终止father , 在child 执行 setsid ,创建一个new session, 然后再次fork , 再次终止father , 这时的child 属于new session中的一员 , 并且不是这个new session 的首进程,而new session 的创建会断开原始关联的终端,所以最终的 child 没有终端。(以上方式来自 apue 书)。我按照书描述写了如下:
int main()
{
int fork_id ;
switch(fork_id=fork())
{
case -1:{ printf("fork failed"); return(-1); }
case 0:{ printf("child"); setsid();
fork_id=fork();
if(fork_id==0) { printf("child without /dev/tty"); }
else { printf("father"); exit(2); }
break ; }
default:{ printf("father"); break ; }
}
return(1);
}
按照我的理解,执行到 setsid();后进程就应已经断开了终端,其后执行到 if(fork_id==0) 时如果是子进程,则执行 printf("child without /dev/tty");
时,已经是session 的非首进程,肯定是没有终端关联的。
我的问题:既然终端都没有了,那么child 进程的标准输出printf("child without /dev/tty");
肯定不会再显示到我的屏幕上了,可是实际程序却是依然输入到我的屏幕,这是为什么?