问题标签 [boost-process]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
32899 浏览

c++ - Boost.Process 在哪里?

我需要执行一个程序并用 C++ 检索它的标准输出。我也希望我的代码是跨平台的。

最近发现了 Boost c++ 库可以满足您所有跨平台需求的美妙世界,我想我应该去 boost.org 并阅读 Boost.Process 的文档。令我惊讶的是,它不存在!然后我开始弄清楚 Boost 给他们的跨平台库起什么名字来启动外部进程,但到目前为止还没有找到它。

Google 搜索将我带到 Julio M. Merino Vidal 的Boost.Process,这似乎是我正在寻找的非官方 Boost 库。奇怪的是,我似乎在那个网站上找不到下载链接。似乎该项目最近也没有任何进展。

我终于能够在外部站点上找到 Vidal 的 Boost.Process 的下载链接,并且现在将使用它,但我对我必须付出的努力才能获得跨平台 c++ 库以与外部进程交互。

那么,为什么没有官方的Boost.Process呢?看起来这将是一个非常有价值的补充。还是我完全忽略了这里明显的解决方案?您能否建议其他跨平台库来管理外部流程的简单启动和交互?

0 投票
1 回答
2260 浏览

c++ - 声明用户定义类型的变量以供以后初始化

我想创建一个名为的全局变量,process而无需在第一时间为其分配任何内容。稍后我将在操作系统中生成一个新进程,并将其分配给该变量。

它可以像这样在 C# 中完成:


我编写了下面的代码来用 C++ 完成同样的事情。该process变量是类型child(来自Boost::Process v0.31)。为简单起见,省略了#include 。

测试.hpp

测试.cpp

主文件

但是,它为Test.cpp返回以下错误:

错误 C2512:'boost::process::child':没有合适的默认构造函数可用


如何正确完成?

0 投票
1 回答
524 浏览

c++ - 使用 Boost 监控后代进程的创建

我正在我的程序中创建一个可能创建子进程的进程(假设是进程 X) ,他们也可能这样做,我无法确定进程树何时完成(=所有后代都已退出)。

我还没有找到任何直接的 Boost 方法来做到这一点。

我的(非防弹)解决方案是维护一个受监视进程的列表,从列表中的进程 X 开始,并定期监视系统中的进程,当检测到它的父 ID 在列表中的进程时,添加进程 ID 也添加到列表中。一旦我进入一个监控周期,表明列表中的所有进程都已完成,那么进程树就完成了。

这种方法的两个主要问题是:

  1. 一个过程可能会“溜走”——考虑以下流程:

    • 监控周期已结束,列表为 [X]。

    • 进程 X 创建一个进程 Y,该进程创建 Z 并终止。

    • 监控周期已经开始 - 因为它
      已经完成,所以它不会检测到进程 Y,并且它不会检测到进程 Z,因为没有检测到进程 Y。

  2. 这种类型的监控非常消耗资源——因为它需要非常频繁地运行,以最大限度地减少问题 1 中描述的这些“失误”。

我的程序中使用的一些代码片段:

进程 X 创建:

进程 X 监控(简单、不足的情况):

重要笔记:

  1. 我无法控制子进程(进程 X),也不知道它要做什么,也不知道它会产生什么进程。
  2. 我的解决方案应该同时适用于 Windows 和 Linux(如果不可能,我将不得不在我的程序中使用特定于操作系统的代码,这(到目前为止)与操作系统无关)。
0 投票
1 回答
1049 浏览

boost-process - Boost Process:如何将进程输出重定向到文件?

使用 Boost::Process 库启动一个进程,我从标准输出读取输出没有问题。但是,如果我想将标准输出重定向到文件,我将如何去做呢?

0 投票
1 回答
329 浏览

python - 使用 boost::process 0.5。无法为 python.exe 重定向 stdio

我正在 Windows 上使用一些 C++ 来启动 python.exe (2.7) 并使用 stdin、stdout 和 stderr 与之交互。我正在使用 Visual Studio 2015、Boost 1.59 和 Boost Process 0.5。

我通过设置命令行来成功启动 python.exe,例如“python -c”print 'hello world'”,并且标准输出捕获“hello world”。

这是代码:

如果我删除 set_cmd_line() 或将字符串更改为 L“python”,我希望 Python 启动到交互模式,就像我从命令行执行“python.exe”一样。

该代码在这里:

当我运行第二个示例时,python 将暂时运行,然后关闭。

这个程序的一些背景。我想创建一个 Python 记录器,它逐行读取 Python 文件,并逐行执行它,就好像它是在解释器中编写的一样。因此,会有如下代码:

我与 boost 无关,我尝试过其他选项,例如 Poco 和MSDN Windows 示例,但没有成功。

当然,在正确传输标准输出/标准错误后,标准输入也将正常工作。我也试图让它发挥作用,但失败了。

提前致谢!

0 投票
1 回答
505 浏览

c++ - Visual Studio 2015:找不到`char * * __cdecl __p__environ(void)`

我正在尝试使用 VS2015 WIN64 构建boost.process(前段时间使用 VS2010 WIN32 和 WIN64 没有任何问题)。

链接器抱怨char * * __cdecl __p__environ(void)找不到:

这是导致此链接问题的代码:

替换char *environ = ::GetEnvironmentStrings();char *environ = NULL;不能解决问题。评论整个集团解决了这个问题。

0 投票
2 回答
872 浏览

c++ - Boost.Process wait_for_exit(child):崩溃?

我正在使用 0.5 版Boost.Process。文档可以在这里找到。我正在使用 Mac OS X Yosemite。

我的问题:我正在将编译作为子进程启动。我想等待该过程完成。

当我的子进程正确编译时,一切正常。

但是当我的子进程没有编译时,我的代码在调用时似乎崩溃了boost::process::wait_for_exit

我的用户代码如下所示:

编辑:代码已被编辑以匹配最新、更正确的版本(仍然不起作用)。

的内部实现bp::wait_for_exit

::waitpid当我的编译命令失败时,之后的代码永远不会到达。显示的错误是:“child has exited; pid: xxxx; uid: yyy; exit value: 1”。

问题:

  1. 这是一个错误还是我在滥用boost::process::wait_for_exit.
  2. 任何避免我遇到的崩溃的解决方法是便携的?
0 投票
0 回答
400 浏览

c++ - 使用 Boost.Process 调用 FFMPEG

我正在尝试从我的 C++ 进程中调用 FFMPEG 以从 IP 摄像机流式传输视频。我使用的 FFMPEG 命令是ffmpeg.exe -rtsp_transport tcp -i rtsp://10.0.1.21/ONVIF/MediaInput?profile=1_def_profile4 -f image2pipe -pix_fmt rgb24 -vcodec rawvideo -r 15 -. 我已经在命令提示符下验证了这个命令,它确实启动了一个视频流并将帧转储到stdout. 我还在 Python 中编写了类似的代码,并且可以正常工作。

这是我用来使用 C++ 中上一段中的参数调用 FFMPEG 并从stdout.

的输出stderr表明参数可能传递错误。

有没有办法显示带有boost::process::launch正在调用的参数的完整命令行?有什么明显的我做错了boost::process吗?

更新

怀疑它可能是错误传递的命令行参数,我创建了一个虚拟可执行文件,打印出它接收到的命令行参数。它是 pure 的直接替代品,ffmpeg.exe因此我可以看到正在传递哪些命令行。我得到的命令行是-rtsp_transport tcp -i rtsp://10.0.1.21/ONVIF/MediaInput?profile=1_def_profile4 -f image2pipe -pix_fmt rgb24 -vcodec rawvideo -r 15 -. 使用该命令行手动调用 ffmpeg 可以按预期工作。然而不知何故,当通过boost::process.

** 解决方案 **

看起来我需要设置上下文的环境字段。不知道为什么这可以解决问题,但确实可以。

0 投票
1 回答
1063 浏览

c++ - Boost.Process 检查进程是否终止

是否可以检查进程是否终止?

我不想打电话.wait(),因为它是阻塞的,我想管理一个超时,之后我将终止进程。

现在我有以下代码:

但它不会等待终止,也不会检查进程是否正常终止。

0 投票
2 回答
297 浏览

c++ - boost::process 由于 boost::throw_exception 而无法编译

当试图包含 boost::process 库时,我得到了 2 个与 boost::process pipe.hpp 文件有关的错误,它处理异常的方式。

这是 boost::process pipe.hpp 中的违规行:

我认为这与 boost 可能如何改变它处理异常的方式有关,并且 boost::process 没有更新以支持它,但是我不熟悉 boost 是如何改变的。整个 pipe.hpp 文件会抛出这样的异常,但它们不会出现在错误中,因为它们位于未定义的定义保护之后。