如何从终端stdin重定向到进程stdin

时间:2015-04-10 02:11:07

标签: c++ linux bash ssh

我的运行进程使用getchar()处理stdin。我在前台运行时工作正常。但是,如果我在后台运行它并执行echo "a">> /proc/pid/fd/0它将无法正常工作。在我的系统上,/proc/pid/fd/0/proc/pts/0相同,那么如何向进程的stdin发送以便getchar()可以看到它?我在ssh上使用C ++工作。

1 个答案:

答案 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
  • 在复杂情况下使用UNIX套接字
  • 如果您仍需要伪终端,请使用screen或其他终端模拟器为您的程序创建一个新终端。