通过linux终端将数据发送到另一个进程的stdin

时间:2016-05-24 21:49:09

标签: c++ linux bash pipe

我一直在尝试将数据发送到正在运行的进程的stdin。这是我的工作:

  1. 在终端中,我启动了一个简单读取字符串并打印出来的c ++程序。代码摘录:

    while (true) {
        cin >> s;
        cout << "I've just read " << s << endl;
    }
    
  2. 我得到正在运行的程序的PID

  3. 我转到/proc/PID/fd/
  4. 我执行echo text > 0
  5. 结果:text出现在运行程序的终端中。请注意,不是I've just read text,而只是text。 我做错了什么,我应该怎么做才能打印'I've just read text'

3 个答案:

答案 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)都会打开另一端,所以你可以试着写一下。

相关问题