为什么在shell中输入时其他后台进程无法读取键盘输入?
问题解答
核心原因是终端设备的前台进程组管控机制和CPU时间片调度是两套完全独立的系统规则,CPU调度权限不代表终端输入访问权限:
- 类Unix系统中每个终端实例(物理tty或虚拟pts)都有且仅有一个前台进程组,键盘输入、终端相关信号(比如Ctrl+C触发的
SIGINT)只会被发送给前台进程组内的进程,其余后台进程组的进程默认没有读取终端输入的权限。 - 你打开的多个shell里,只有当前正在交互的活跃shell属于终端的前台进程组,其余非活跃shell全部归属后台进程组。
当非活跃shell被CPU调度获得时间片运行时,如果它尝试调用read等系统接口读取终端输入,内核会直接向该进程发送SIGTTIN信号,该信号的默认处理逻辑是暂停进程运行,直到这个shell被切换为前台进程才会恢复执行,自然也就读不到任何键盘输入。
补充误区验证:你可以在任意活跃shell中执行
cat &命令把cat程序放到后台运行,cat启动后会尝试读取终端标准输入,此时用jobs命令查看就能看到cat进程已经处于Stopped状态,只有执行fg命令把它切到前台才能正常接收键盘输入。
内容的提问来源于stack exchange,提问作者zhangcw
相关产品推荐
相关产品推荐

