首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >会话中的现有进程如何了解并获取会话领导者刚刚获取的控制终端?

会话中的现有进程如何了解并获取会话领导者刚刚获取的控制终端?
EN

Stack Overflow用户
提问于 2018-06-02 03:15:58
回答 1查看 138关注 0票数 2

在第一个场景中,进程调用setsid()以启动新会话并成为其领导者,并调用open()以连接到控制终端。然后,会话领导者继续fork()子进程,子进程将继承控制终端的文件描述符。

在第二个场景中,如果一个会话已经有多个进程,但是没有控制终端,然后领导者创建了一个到控制终端的连接,那么会话中的其他进程怎么办:

  • 会话中的其他进程如何获知会话具有控制终端和
  • 它们如何将控制终端作为文件描述符打开?

谢谢。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 04:32:50

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

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

(作为一般规则,在Unix中,操作调用进程的状态的操作永远不会对任何其他进程产生任何影响,即使它们看起来应该这样做;同样作为一般规则,当我们说某某是通过fork继承时,我们指的是将该状态片段复制到子进程中,而不是在父进程和子进程之间共享。一个重要的例外是“打开文件描述”,它们是共享的。如果在派生的进程中打开了一个常规文件,并且子进程对其继承的文件描述符调用lseek,则父进程将看到查找指针移动。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50649796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档