在第一个场景中,进程调用setsid()
以启动新会话并成为其领导者,并调用open()
以连接到控制终端。然后,会话领导者继续fork()
子进程,子进程将继承控制终端的文件描述符。
在第二个场景中,如果一个会话已经有多个进程,但是没有控制终端,然后领导者创建了一个到控制终端的连接,那么会话中的其他进程怎么办:
谢谢。
发布于 2018-06-02 04:32:50
在许多文档中,控制终端被描述为整个会话的属性,但它实际上是每个单独进程的属性,在fork
中是从父进程继承到子进程的。进程必须是会话领导者才能将自己附加到控制tty,但是任何进程都可以使用TIOCNOTTY
ioctl从它的控制tty分离。因此,系统被设置为处理处于会话中但未附加到控制tty的进程。
在您的“第二个场景”中,会话领导者在附加到控制tty之前派生的进程不会与该tty一起附加。这意味着它们不完全是会话的一部分,就像从控制tty分离的进程不完全是会话的一部分一样:它们不能用tcsetpgrp
放到前台,它们不能打开/dev/tty
,如果控制tty挂起它们就不会收到SIGHUP
,等等。另一方面,会话领导者在附加控制tty之后派生的进程将照常继承。
(作为一般规则,在Unix中,操作调用进程的状态的操作永远不会对任何其他进程产生任何影响,即使它们看起来应该这样做;同样作为一般规则,当我们说某某是通过fork
继承时,我们指的是将该状态片段复制到子进程中,而不是在父进程和子进程之间共享。一个重要的例外是“打开文件描述”,它们是共享的。如果在派生的进程中打开了一个常规文件,并且子进程对其继承的文件描述符调用lseek
,则父进程将看到查找指针移动。)
https://stackoverflow.com/questions/50649796
复制相似问题