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

How to redirect from terminal stdin to process stdin

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

当你 运行 多个程序在后台时,它们仍然有 /dev/pts/XX 作为它们的控制终端(和 stdin),但它们不再有资格从中读取 --只有 shell 或前台任务可以做到这一点。如果他们这样做,他们将收到停止后台进程的 SIGTTIN 信号:

myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$ 

[1]+  Stopped                 cat

这种行为的原因很简单:多个程序从一个源读取导致 race condition。 IE。当您输入 shell who am i 时,shell 将读取 who,后台任务 #1 将读取 am,任务 #2 将读取 i .

解决方法很简单——不要使用伪终端在进程间传输数据:

  • 使用管道 -- 未命名或命名(mkfifo)。它们就像从 stdin 读取一样简单。现代 shells 还提供 coprocesses 来避免命名管道。
  • 在复杂情况下使用 UNIX 套接字
  • 如果您仍然需要伪终端,请使用 screen 或其他终端仿真器为您的程序创建一个新伪终端。