| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 908 人关注过本帖
标题:如何检查一个进程所关联的终端设备? (linux 系统下)
只看楼主 加入收藏
zhiys
Rank: 2
等 级:论坛游民
帖 子:3
专家分:15
注 册:2011-8-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
如何检查一个进程所关联的终端设备? (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");
肯定不会再显示到我的屏幕上了,可是实际程序却是依然输入到我的屏幕,这是为什么?
搜索更多相关主题的帖子: 设备 father return failed 
2011-08-03 15:34
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:20 
你确定这个能断开所连接的终端吗

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2011-08-03 15:42
zhiys
Rank: 2
等 级:论坛游民
帖 子:3
专家分:15
注 册:2011-8-3
收藏
得分:0 
终端肯定是断开了, 通过检查 ps -ajx|grep "进程名" , 会发现进程对应的 终端不是具体的设备名  比如:/dev/pts/1 (伪终端),而是一个? 号,但我不明白,这种情况下,标准输出怎么还会显示到屏幕上,原因是什么
2011-08-03 15:50
快速回复:如何检查一个进程所关联的终端设备? (linux 系统下)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016094 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved