控制终端&新会话
进程(在我的例子中是会话领导者)如何获得控制终端?
我在程序中所做的事情:
1. fork;
2. parent -> while(1) or smth. similar;
3. child -> setsid();
exec "man ps";
我相信我不会在输出中得到任何结果。 (孩子是会话领导者,因此现在它与旧的 tty 没有关系)但我明白但不明白为什么。人的输出。但不具备互动性。当我按 Ctrl-z 时,它会变成交互式,当我按“q”时,它会停止并返回到我的 prog(父级)。所以问题是:
- 请解释一下开始时发生了什么(为什么我必须按 ctrl-z,请阅读上面的内容)
- 为什么 man 在该 shell 中执行一些输出?
- man 如何在没有任何 tty 连接的情况下做到这一点(我用 ps 检查过,man 和 pager 在 TTY 栏中有“?”)
- 最后:新的会话领导者如何获得控制终端。除了
open(/dev/tty)
之外还有其他方法吗?
How can a process (in my case session leader) get controlling terminal?
What I do in my program:
1. fork;
2. parent -> while(1) or smth. similar;
3. child -> setsid();
exec "man ps";
I beleived that i would get nothing in the output. (child is a session leader and therefore now it has no relation to old tty) But i got and don't understand why. Man ouputs. But is not interactive. When I press Ctrl-z it becomes interactive when i press 'q' it quites and returnes to my prog(parent). So the questions are:
- Please explain what happens at the beginning (why I have to press ctrl-z, read above)
- Why man does some output in that shell?
- How can man do it without any tty connected (I checked it with ps, man and pager have "?" in TTY column)
- And finally: how can a new session leader acquire a controlling terminal. Are there any wayes besides
open(/dev/tty)
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问 1 至 3:即使在 setsid() 之后,子进程仍保留对 stdin、stdout 等的访问。您需要显式关闭它们(或使用例如
open("/dev/null",O_RDWR);
重新打开它们)。问 4:
< a href="http://uw714doc.sco.com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html" rel="nofollow" title="控制终端和进程组">http://uw714doc.sco。 com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html
Q. 1. to 3.: The child process keep access to stdin, stdout etc., even after setsid(). You need to close them explicitly (or reopen using eg.
open("/dev/null",O_RDWR);
).Q 4.:
http://uw714doc.sco.com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html