2

进程(在我的情况下是会话负责人)如何获得控制终端?

我在我的程序中做什么:

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

我相信我不会在输出中得到任何东西。(孩子是会话负责人,因此现在它与旧 tty 无关)但我明白了,但不明白为什么。人输出。但不是交互式的。当我按下 Ctrl-z 时,当我按下 'q' 时它变成交互式的,它安静并返回到我的 prog(父级)。所以问题是:

  1. 请解释一开始发生了什么(为什么我必须按 ctrl-z,请阅读上文)
  2. 为什么 man 在那个 shell 中有一些输出?
  3. 在没有连接任何 tty 的情况下,人如何做到这一点(我用 ps 检查过,man 和 pager 在 TTY 列中有“?”)
  4. 最后:新的会话领导者如何获得控制终端。除此之外还有什么办法open(/dev/tty)吗?
4

1 回答 1

3

Q. 1. 到 3.:子进程保持对标准输入、标准输出等的访问,即使在 setid() 之后也是如此。您需要明确关闭它们(或使用例如重新打开open("/dev/null",O_RDWR);)。

问 4:

当没有控制终端的会话领导者打开终端设备文件并且打开​​时清除标志 O_NOCTTY 时,如果该终端尚未分配给某个会话,则该终端将成为分配给会话领导者的控制终端

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

于 2011-01-05T14:09:21.577 回答