【问题标题】:Sending data to stdin of another process through linux terminal通过linux终端向另一个进程的stdin发送数据
【发布时间】:2016-05-24 21:49:09
【问题描述】:

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

  1. 在终端中,我启动了一个 c++ 程序,它只是读取一个字符串并打印它。代码摘录:

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

  3. 我去/proc/PID/fd/
  4. 我执行echo text &gt; 0

结果:text 出现在程序运行的终端中。请注意,不是I've just read text,而只是text。 我做错了什么,我应该怎么做才能让这个东西打印'I've just read text'

【问题讨论】:

  • 如何从 shell 执行程序?您是否将其作为后台进程运行?
  • 不,我只是在前台运行。它有什么改变吗?

标签: c++ linux bash pipe


【解决方案1】:

当您启动您的 C++ 程序时,您需要确保其输入来自管道而不是来自终端。你可以使用cat | myapp 来做到这一点。运行后,您可以将应用程序的 PID 用于echo text &gt; /proc/PID/fd/0

【讨论】:

    【解决方案2】:

    这可能是stdout 未正确刷新的问题 - 请参阅“Unix Buffering”。或者,您可能会像一些评论员所建议的那样处于不同的外壳中。

    一般来说,通过 FIFO 或 NOD(命名管道)处理基本的进程间通信更可靠。 (或者将stdout 和/或stderr 重定向到一个文件,并使用您的c++ 程序从该文件中读取。)

    这里有一些关于如何在终端和c++ 中使用它们的好资源。

    "FIFO – Named pipes: mkfifo, mknod"
    "Using Pipes in Linux Processes"
    "Programming with FIFO: mkfifo(), mknod()"

    【讨论】:

    • 这些很棒,谢谢。我尝试使用管道,但决定尽可能简单,但仍然无法正常工作。
    【解决方案3】:

    FD 0 是程序运行的终端。当您写入 FD 0 时,您正在写入程序正在运行的终端。 FD 0 不需要以只读模式打开;实际上它似乎是读/写模式,所以你可以写它。 (我怀疑这是因为 FD 0、1 和 2 都引用了相同的文件描述)

    所以echo text &gt; /proc/PID/fd/0 只是将text 回显到终端。

    要将输入通过管道传输到程序,您需要写入管道的另一端(实际上是一个 PTY,其行为主要类似于一对管道)。很可能,您使用的任何终端仿真器(xterm、konsole、gnome-terminal)都会打开另一端,因此您可以尝试写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2012-01-30
      • 2012-10-17
      • 2019-03-20
      相关资源
      最近更新 更多