【问题标题】:Subprocess communication. C++子进程通信。 C++
【发布时间】:2017-02-14 15:12:44
【问题描述】:

我正在尝试编写一个 C++ 程序,它将像守护进程一样启动新进程(一些脚本、程序、命令)并从中获取一些信息(标准输出)。我正在尝试使用 popen()。但子进程在主程序完成时完成。我不知道,C++ 是否有像 Python(子处理)这样易于使用的东西。有我的代码:

#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
  FILE *in;
  char buff[512];
  in = popen(argv[1], "r");
  fgets(buff, sizeof(buff), in);
  cout << buff;
}

P.S: & 在执行命令的末尾没有帮助。

【问题讨论】:

  • 添加输入 (argv[1]) 是什么,输出 (buff) 是什么以及您想要的输出是什么。这将有助于重现问题。
  • 我会说这不是一个通信问题:当父进程停止时,它的子进程也会停止,除非他们采取了预防措施。这是标准行为,与 C/C++ 无关。如果您让父进程从“in”读取直到子进程完成,那将解决第一个问题。
  • 您可能还希望将您的问题标签缩小到 POSIX 操作系统或 Linux 或您所针对的任何操作系统(即 Microsoft Windows 有不同的 API 来运行子进程)

标签: c++ subprocess popen


【解决方案1】:

fgets 不会等待子进程完成,popen 也不会。

你需要读到in结尾:

while (fgets(buff, sizeof(buff), in))
{
    cout << buff;
}

【讨论】:

    【解决方案2】:

    popen函数参考:http://man7.org/linux/man-pages/man3/popen.3.html

    摘录:
    “popen() 函数通过创建管道、forking 和调用 shell 来打开一个进程。”

    我认为由于 fork 机制,当您的(调用)进程结束时,它的子进程(被调用的)也会停止,至少作为默认行为。
    一种选择是继续从管道读取(并保持调用者进程运行)直到子进程结束。

    您的代码在退出之前也缺少pclose(in)

    另见this other post on StackOverflow

    【讨论】:

      【解决方案3】:

      看看这里https://github.com/arun11299/cpp-subprocess

      这个库可能正是您正在寻找的。​​p>

      【讨论】:

        猜你喜欢
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多