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

5

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


1
我认为你可能需要研究termios.h。 - Deanie
尝试将重定向符号>>改为管道符号| - Neo1989
1
@Neo1989 把它改成 | 是不行的。sudo echo "a"| /proc/5133/fd/0 -bash: /proc/5133/fd/0: 权限被拒绝 - user3472537
可能是writing-to-stdin-of-background-process的重复问题。使用命名管道的解决方案应该有效。 - Vivek
@Neo1989仍然没有起作用,但我找到了一个使用mkfifo的解决办法。 - user3472537
显示剩余3条评论
1个回答

3
当您在后台运行多个程序时,它们仍然将/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 socket
  • 如果仍然需要伪终端,请使用screen或其他终端模拟器为您的程序创建一个新的伪终端。

1
哦,顺便说一句,还有一个解决方案:协处理器。在正好一个 shell 上下文中运行。 - 4ae1e1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接