我的运行进程使用getchar()
处理stdin。我在前台运行时工作正常。但是,如果我在后台运行它并执行echo "a">> /proc/pid/fd/0
它将无法正常工作。在我的系统上,/proc/pid/fd/0
与/proc/pts/0
相同,那么如何向进程的stdin发送以便getchar()
可以看到它?我在ssh上使用C ++工作。
答案 0 :(得分:3)
当您在后台运行多个程序时,它们仍然有/dev/pts/XX
作为其控制终端(和stdin
),但它们不再有资格从中读取 - 只有shell或前台任务可以去做。如果他们这样做,他们将获得SIGTTIN
信号,停止后台进程:
myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
这种行为的推理很简单:从一个来源读取的多个程序会导致race condition。即当您输入shell who am i
时,shell将显示who
,后台任务#1将显示为am
,任务#2将显示为i
。
解决方案很简单 - 不要使用伪终端在进程之间传输数据:
mkfifo
)。它们就像从stdin
阅读一样简单。现代shell还提供了允许避免命名管道的 coprocesses 。 screen
或其他终端模拟器为您的程序创建一个新终端。