终端 I/O 深入解析:会话、进程组与属性设置
1. 会话与进程组基础概念
当用户登录时,会创建一个新的会话。这个会话包含一个新的进程组,进程组里有一个运行登录 shell 的进程。该进程既是进程组的领导者,其进程 ID 也是进程组 ID,同时它还是会话领导者,进程 ID 也就是会话 ID。用户登录所用的终端成为该会话的控制终端,会话领导者也是控制进程。
如果 shell 启用了作业控制,当命令或命令管道在后台运行时,会形成新的进程组。例如 $ du –a | grep tmp >out.tmp& 会创建一个包含两个进程的新进程组。此时,前台和后台的进程组都在同一个会话中,且共享同一个控制终端。
作业控制的关键在于,从控制终端产生的特定信号(如中断 SIGINT、退出 SIGQUIT 或暂停 SIGTSTP)只会发送到前台进程组,不会影响后台进程组。用户可以通过 shell 命令在前台和后台之间移动进程组。若未启用作业控制,新进程会和 shell 在同一个进程组中运行,控制终端产生的信号会发送给该进程组的所有进程。
当控制终端挂断或断开连接时,会向控制进程发送 SIGHUP 信号,默认会终止该进程。一旦控制进程终止,前台(或唯一)进程组的每个进程都会收到 SIGHUP 信号,默认也会导致它们终止。
如果后台进程组中的进程尝试访问控制终端,基本规则是:后台进程读取控制终端会收到 SIGTTIN 信号,写入则会收到 SIGTTOU 信号。这些信号默认会使进程暂停,但也有一些例外情况:
|情况|结果|
|----|----|
|后台进程尝试读取且忽略或阻塞 SIGTTIN
超级会员免费看
订阅专栏 解锁全文
1106

被折叠的 条评论
为什么被折叠?



