You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何后台进程的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:23