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/代码>作为它们的控制终端(和myaut@zenbook:~$ cat &
[1] 15250
myaut@zenbook:~$
[1]+ Stopped cat
这种行为的原因很简单:从一个源读取多个程序会导致错误。也就是说,当您输入shell我是谁
,shell将读取谁
,后台任务#1将读取am
,任务#2将读取I
解决方案很简单——不要使用伪终端在进程之间传输数据:
- 使用管道——未命名或命名(使用
)。它们非常简单,只需从mkfifo
读取即可。现代shell还提供了允许避免命名管道的协进程李>stdin
- 在复杂情况下使用UNIX套接字
- 如果您仍然需要一个伪终端,请使用
或其他终端仿真器为您的程序创建一个新的伪终端screen
>
更改为管道
@Neo1989将其更改为|将不起作用。sudo echo“a”|/proc/5133/fd/0-bash:/proc/5133/fd/0:权限被拒绝可能重复的。使用命名管道的解决方案应该有效。@user3472537抱歉,我把文件误认为是程序。试试这个:echo“a”| sudo tee/proc/file
。将-a
添加到tee
中,如果要将该值附加到文件中哦,顺便说一下,还有一个解决方案:协进程。在上下文中仅在一个shell中运行。