如何从终端标准输入重定向到进程标准输入

use*_*537 5 c++ linux ssh bash

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

mya*_*aut 3

当您在后台运行多个程序时,它们仍然具有/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 还提供协进程,可以避免命名管道。
  • 在复杂情况下使用 UNIX 套接字
  • 如果您仍然需要伪终端,请使用screen或其他终端仿真器为您的程序创建一个新终端。