问题标签 [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.
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呢?看起来这将是一个非常有价值的补充。还是我完全忽略了这里明显的解决方案?您能否建议其他跨平台库来管理外部流程的简单启动和交互?
c++ - 声明用户定义类型的变量以供以后初始化
我想创建一个名为的全局变量,process
而无需在第一时间为其分配任何内容。稍后我将在操作系统中生成一个新进程,并将其分配给该变量。
它可以像这样在 C# 中完成:
我编写了下面的代码来用 C++ 完成同样的事情。该process
变量是类型child
(来自Boost::Process v0.31)。为简单起见,省略了#include 。
测试.hpp
测试.cpp
主文件
但是,它为Test.cpp返回以下错误:
错误 C2512:'boost::process::child':没有合适的默认构造函数可用
如何正确完成?
c++ - 使用 Boost 监控后代进程的创建
我正在我的程序中创建一个可能创建子进程的进程(假设是进程 X) ,他们也可能这样做,我无法确定进程树何时完成(=所有后代都已退出)。
我还没有找到任何直接的 Boost 方法来做到这一点。
我的(非防弹)解决方案是维护一个受监视进程的列表,从列表中的进程 X 开始,并定期监视系统中的进程,当检测到它的父 ID 在列表中的进程时,添加进程 ID 也添加到列表中。一旦我进入一个监控周期,表明列表中的所有进程都已完成,那么进程树就完成了。
这种方法的两个主要问题是:
一个过程可能会“溜走”——考虑以下流程:
监控周期已结束,列表为 [X]。
进程 X 创建一个进程 Y,该进程创建 Z 并终止。
监控周期已经开始 - 因为它
已经完成,所以它不会检测到进程 Y,并且它不会检测到进程 Z,因为没有检测到进程 Y。
这种类型的监控非常消耗资源——因为它需要非常频繁地运行,以最大限度地减少问题 1 中描述的这些“失误”。
我的程序中使用的一些代码片段:
进程 X 创建:
进程 X 监控(简单、不足的情况):
重要笔记:
- 我无法控制子进程(进程 X),也不知道它要做什么,也不知道它会产生什么进程。
- 我的解决方案应该同时适用于 Windows 和 Linux(如果不可能,我将不得不在我的程序中使用特定于操作系统的代码,这(到目前为止)与操作系统无关)。
boost-process - Boost Process:如何将进程输出重定向到文件?
使用 Boost::Process 库启动一个进程,我从标准输出读取输出没有问题。但是,如果我想将标准输出重定向到文件,我将如何去做呢?
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 示例,但没有成功。
当然,在正确传输标准输出/标准错误后,标准输入也将正常工作。我也试图让它发挥作用,但失败了。
提前致谢!
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;
不能解决问题。评论整个集团解决了这个问题。
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”。
问题:
- 这是一个错误还是我在滥用
boost::process::wait_for_exit
. - 任何避免我遇到的崩溃的解决方法是便携的?
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
.
** 解决方案 **
看起来我需要设置上下文的环境字段。不知道为什么这可以解决问题,但确实可以。
c++ - Boost.Process 检查进程是否终止
是否可以检查进程是否终止?
我不想打电话.wait()
,因为它是阻塞的,我想管理一个超时,之后我将终止进程。
现在我有以下代码:
但它不会等待终止,也不会检查进程是否正常终止。
c++ - boost::process 由于 boost::throw_exception 而无法编译
当试图包含 boost::process 库时,我得到了 2 个与 boost::process pipe.hpp 文件有关的错误,它处理异常的方式。
这是 boost::process pipe.hpp 中的违规行:
我认为这与 boost 可能如何改变它处理异常的方式有关,并且 boost::process 没有更新以支持它,但是我不熟悉 boost 是如何改变的。整个 pipe.hpp 文件会抛出这样的异常,但它们不会出现在错误中,因为它们位于未定义的定义保护之后。