c - session 中的现有进程将如何了解和获取 session 领导者刚刚获取的控制终端?

标签 c linux terminal process

在第一种情况下,进程调用setsid() 开始一个新 session 并成为其领导者,并调用open() 连接到控制终端。然后 session 负责人继续 fork() 子进程,子进程将文件描述符继承到控制终端。

在第二种情况下,如果一个 session 已经有多个进程但没有控制终端,然后领导者创建一个到控制终端的连接,那么 session 中的其他进程呢:

  • session 中的其他进程如何知道 session 有一个控制终端和

  • 他们如何将控制终端作为文件描述符打开?

谢谢。

源自https://unix.stackexchange.com/questions/446207/for-a-process-what-are-the-differences-between-a-controlling-terminal-and-non-c

最佳答案

控制终端在很多文档中被描述为整个 session 的属性,但它实际上是每个单独进程的属性,在 fork 中从父进程继承到子进程。进程必须是 session 领导者才能将自己附加到控制 tty,但任何进程都可以使用 TIOCNOTTY ioctl 从其控制 tty 中分离出来(如果有的话)。因此系统设置为处理 session 中但未附加到控制 tty 的进程。

在您的“第二个场景”中, session 负责人在附加到控制 tty 之前 fork 的进程不会与其一起附加到该 tty。这意味着它们不完全是 session 的一部分,就像已经脱离控制 tty 的进程不完全是 session 的一部分一样:它们不能用 tcsetpgrp 放在前台>,它们无法打开 /dev/tty,如果控制 tty 挂断,它们不会收到 SIGHUP,等等。 session 领导者在附加控制后派生的进程另一方面,tty 将像往常一样继承它。

(作为一般规则,在 Unix 中,操纵调用进程状态的操作从不对任何其他进程有任何影响,即使它们看起来应该如此;同样作为一般规则,当我们说某某通过 fork 继承时,我们的意思是状态片被复制到子进程中,而不是在父进程和子进程之间共享。一个重要的异常(exception)是“打开文件描述, 是共享的。如果您在 fork 的进程中打开一个常规文件,并且子进程对其继承的文件描述符调用 lseek,则父进程将看到搜索指针移动。)

关于c - session 中的现有进程将如何了解和获取 session 领导者刚刚获取的控制终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649796/

相关文章:

c - 如何只在前台杀死子进程?

macos - Mac 终端 Vim 仅在行尾时使用退格键

c - 重复错误 : C file include

c - 编译时出错 - 初始化程序中指定的未知字段

linux - 尽管系统上有足够的空间,但 Hudson 失败并显示错误 "No space left on device"

c - recvfrom() 套接字编程 Ubuntu

linux - 无法访问 virtualbox 中的串行端口设置

c++ - 什么会导致 cout << variable << "\t";当输出超过终端宽度时打印空格而不是值?

linux - 移动 linux 目录,除非它已经存在

c - 在C中对多维数组进行排序