为何后台进程的stdin仍关联到终端?
问题背景
执行以下命令启动后台进程:
bash test.sh & ps 457349 pts/5 00:00:00 bash 458609 pts/5 00:00:00 sleep 458656 pts/5 00:00:00 ps 1107610 pts/5 00:01:47 zsh lsof -p 457349 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 457349 pk 0u CHR 136,5 0t0 8 /dev/pts/5 bash 457349 pk 1u CHR 136,5 0t0 8 /dev/pts/5 bash 457349 pk 2u CHR 136,5 0t0 8 /dev/pts/5
通过lsof发现后台进程的stdin仍关联到/dev/pts/5终端,但终端输入内容未被该进程感知,原因是什么?
原因解析
终端前台进程组限制:终端设备只会将输入数据发送给当前的前台进程组。从
ps输出可见,当前终端的前台进程是zsh(PID 1107610),后台运行的bash进程(PID 457349)属于后台进程组,终端输入会直接交给zsh处理,不会传递到后台进程的stdin。SIGTTIN信号拦截:即便后台进程主动尝试读取stdin,内核也会向它发送
SIGTTIN信号,该信号默认行为是暂停进程。也就是说,后台进程还没来得及读取输入内容,就被暂停了,自然无法感知到终端输入。
验证方法
执行fg %(%后接进程对应的作业号)将后台进程调到前台,此时它会加入前台进程组,就能正常接收终端输入了。
内容的提问来源于stack exchange,提问作者Betflop
相关产品推荐
相关产品推荐

