当您在后台运行多个程序时,它们仍然具有/dev/pts/XX
控制终端(和stdin
),但它们不再有资格从中读取数据——只有 shell 或前台任务可以做到这一点。如果他们这样做,他们将收到SIGTTIN
停止后台进程的信号:
myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
Run Code Online (Sandbox Code Playgroud)
这种行为的原因很简单:多个程序从一个源读取数据会导致竞争条件。即,当您输入到 shell 时who am i
,shell 将读取who
,后台任务#1 将读取am
,任务#2 将读取i
。
解决方案很简单——不要使用伪终端在进程之间传输数据:
mkfifo
)。它们就像读取一样简单stdin
。现代 shell 还提供协进程,可以避免命名管道。screen
或其他终端仿真器为您的程序创建一个新终端。