如何从terminal标准inputredirect到标准input

我正在运行的进程通过使用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读取一样简单。 现代贝壳还提供协同处理 ,以避免命名管道。
  • 在复杂情况下使用UNIX套接字
  • 如果您仍然需要伪终端,请使用screen或其他终端仿真程序为您的程序创建一个新的终端。