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

C++ 如何从终端stdin重定向到进程stdin,c++,linux,bash,ssh,C++,Linux,Bash,Ssh,我正在运行的进程通过使用getchar()处理stdin。当我在前台运行它时,它工作正常。但是,如果我在后台运行它并执行echo“a”>/proc/pid/fd/0操作,它将无法工作。在我的系统上,/proc/pid/fd/0与/proc/pts/0相同,因此如何发送到进程的stdin,以便getchar()可以看到它?我在C++上使用SSH。 < P>当你在后台运行多个程序时,他们仍然有 /DEV/PTS/XX/代码>作为它们的控制终端(和 STDIN < /COD>),但它们不再有资格读取它

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

< P>当你在后台运行多个程序时,他们仍然有<代码> /DEV/PTS/XX/代码>作为它们的控制终端(和 STDIN < /COD>),但它们不再有资格读取它——只有shell或前台任务才能做到这一点。如果他们这样做,他们将得到停止后台进程的信号:

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

[1]+  Stopped                 cat
这种行为的原因很简单:从一个源读取多个程序会导致错误。也就是说,当您输入shell
我是谁
,shell将读取
,后台任务#1将读取
am
,任务#2将读取
I

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

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

我认为您可能需要研究termios.h。尝试将重定向
>
更改为管道
@Neo1989将其更改为|将不起作用。sudo echo“a”|/proc/5133/fd/0-bash:/proc/5133/fd/0:权限被拒绝可能重复的。使用命名管道的解决方案应该有效。@user3472537抱歉,我把文件误认为是程序。试试这个:
echo“a”| sudo tee/proc/file
。将
-a
添加到
tee
中,如果要将该值附加到文件中哦,顺便说一下,还有一个解决方案:协进程。在上下文中仅在一个shell中运行。