我一直在尝试将数据发送到正在运行的进程的stdin。这是我的工作:
在终端中,我启动了一个简单读取字符串并打印出来的c ++程序。代码摘录:
while (true) {
cin >> s;
cout << "I've just read " << s << endl;
}
我得到正在运行的程序的PID
/proc/PID/fd/
echo text > 0
结果:text
出现在运行程序的终端中。请注意,不是I've just read text
,而只是text
。
我做错了什么,我应该怎么做才能打印'I've just read text'
?
答案 0 :(得分:0)
可能是stdout
未正确刷新的问题 - 请参阅&#34; Unix Buffering&#34;。或者你可能会像一些评论员所说的那样处于不同的外壳中。
通常,通过FIFO或NOD(命名管道)处理基本进程间通信更可靠。 (或者将stdout
和/或stderr
重定向到文件,并使用您的c++
程序从中读取。)
这里有一些关于如何在终端和c++
中使用它们的好资源
&#34; FIFO – Named pipes: mkfifo, mknod&#34;
&#34; Using Pipes in Linux Processes&#34;
&#34; Programming with FIFO: mkfifo(), mknod()&#34;
答案 1 :(得分:0)
当您启动C ++程序时,您需要确保其输入来自管道,而不是来自终端。您可以使用cat | myapp
来执行此操作。一旦运行,您可以将应用程序的PID用于echo text > /proc/PID/fd/0
答案 2 :(得分:0)
FD 0是程序运行的终端。当您写入FD 0时,您正在写入程序运行的终端。 FD 0不需要以只读模式打开;在实践中它似乎是读/写模式,所以你可以写它。 (我怀疑这是因为FD 0,1和2都引用相同的文件描述)
所以echo text > /proc/PID/fd/0
只是将text
发送到终端。
要管道输入到程序,您需要写入管道的另一端(实际上是一个PTY,其行为主要像一对管道)。最有可能的是,你使用的任何终端模拟器(xterm,konsole,gnome-terminal)都会打开另一端,所以你可以试着写一下。