2010-12-20 37 views
2

过程(在我的情况下,会话领导者)如何获得控制终端?控制终端和新会话

我在我的程序做什么:

1. fork; 
2. parent -> while(1) or smth. similar; 
3. child -> setsid(); 
      exec "man ps"; 

我beleived,我会得到什么输出。 (孩子是会议的领导者,因此现在它与老tty没有任何关系)但我明白了为什么。人输出。但不是互动的。当我按下Ctrl-z时,它会变成交互式,当我按下'q'时,它会回复并返回到我的编(父母)。所以问题是:

  1. 请解释之初发生了什么(为什么我必须按CTRL-Z,阅读上面)
  2. 为什么人会在外壳一些输出?
  3. 怎样才能做到这一点没有任何tty连接(我检查了与PS,人和传呼机在TTY栏中有“?”)
  4. 最后:新会议领导者如何获得控制终端。除了open(/dev/tty)还有什么方法吗?

回答

3

问题1到3:即使在setsid()之后,子进程仍然可以访问标准输入,标准输出等。您需要明确关闭它们(或使用例如open("/dev/null",O_RDWR);重新打开)。

Q 4:

当没有控制终端的会话领导者打开一个终端设备文件和标志O_NOCTTY是开放明确的,即终端成为控制端子分配给会议领导者如果终端尚未分配给一些会话

http://uw714doc.sco.com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html