如何从终端标准重定向到处理标准

How to redirect from terminal stdin to process stdin

本文关键字:标准 重定向 处理 终端      更新时间:2023-10-16

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

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

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

这种行为的推理很简单:从一个源读取多个程序会导致竞争条件。 即当你输入到shell who am i时,shell将读取who,后台任务#1将读取am,任务#2将读取i

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

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