我正在运行的进程通过使用getchar()
来处理stdin。 当我在前台运行它时,它工作正常。 但是,如果我在后台运行它,并echo "a">> /proc/pid/fd/0
它将无法正常工作。 在我的系统上, /proc/pid/fd/0
和/proc/pts/0
,所以我怎么发送到进程的stdin,以便getchar()
可以看到它呢? 我通过ssh使用C ++。
当你在后台运行多个程序时,他们仍然有/dev/pts/XX
作为他们的控制终端(和stdin
),但是他们不再有资格从它读取 – 只有shell或foreground任务可以做到这一点。 如果他们这样做,他们会得到SIGTTIN
信号,停止后台进程:
myaut@zenbook:~$ cat & [1] 15250 myaut@zenbook:~$ [1]+ Stopped cat
这种行为的推理很简单:从一个源读取多个程序导致竞争状态 。 即当你输入到shell who am i
,shell将读取who
,后台任务#1将读取am
和任务#2将读取i
。
解决方案很简单 – 不要使用伪终端在进程之间传输数据:
mkfifo
)。 它们就像从stdin
读取一样简单。 现代贝壳还提供协同处理 ,以避免命名管道。 screen
或其他终端仿真程序为您的程序创建一个新的终端。