问题标签 [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++ - 重新启动可执行文件(跨平台)的最佳方式?
背景:
所以我将客户端/服务器类型的应用程序滚动到同一个可执行文件中。
我想要的是,如果它无法在本地主机上连接,它应该自行启动(相同的可执行文件,但使用不同的参数/命令来启动服务器)。然后也许稍等片刻,然后再次尝试连接(仅尝试一次)。这与 'ing 不同但相似fork()
(我本可以使用它,但fork()
不是跨平台的)。
问题
我知道boost::process
可以以独立于平台的方式启动进程,但是有没有办法获取进程的路径以便启动自己(跨平台)?
c++ - 使用 boost::asio::async_write 和 boost::process::async_pipe 多次写入子进程的标准输入
注意:我在这篇文章中交替使用“客户端”和“孩子”这两个词来指代从“服务器”启动的进程。
我正在使用 boost::process::async_pipe 编写使用 boost::process::child 启动的进程的 STDIN。假设我的服务器程序看起来像这样:
(这不是一个有效的服务器演示)
服务器.cpp
基本上我有一个内存缓冲区,我正在其中做一些工作,并且我经常想向子进程发送一些二进制数据。我的子进程看起来像这样:
孩子.cpp
writePipe.close()
注释掉后,我注意到我的子程序在服务器进程终止之前从未获得任何数据。如果我取消注释关闭管道的调用,那么我只能在第一次boost::asio::async_write()
调用时处理数据。
编辑:
不幸的是,@sehe 的原始答案并没有解决这个问题。我稍微更新了服务器代码以更好地说明问题(并且我解决了保留/调整大小问题)。
然而,当我再次环顾四周时,我读到了一些关于sgetn()
它的语言:
streambuf 中 xsgetn 的默认定义从受控输入序列中检索字符并将它们存储在 s 指向的数组中,直到提取了 n 个字符或到达序列的末尾。
所以,我重构了我的客户端,首先询问流有多少字节可用,然后分块读取流。这是我的第一次尝试:
但是,即使在添加之后std::cin.sync_with_stdio(false);
(来自答案Why does in_avail() output zero even if the stream has some char?),调用rdbuf->in_avail()
总是返回0
。即使我尝试在我的服务器之外并在命令行上尝试,例如:ls | client
我希望我的客户端程序在数据进入时读取数据,而不必(1)关闭服务器进程或(2)关闭管道(除非我可以重新打开管道以执行后续write
()。
谢谢!
c++ - 传递文件或标准输入以模糊地提升进程子进程
我正在尝试编写一个基于 boost::process 的程序,该程序能够根据是否定义了将它们重定向到的文件来模糊地重定向输入、输出和错误流,但我正在努力弄清楚如何处理它:
显然,由于类型不兼容,三元运算符不起作用,但我不知道如何实现这一点。我探索了 boost::variant 和 boost::any 但无济于事。
c++ - 使用boost过程不下载所有boost框架可以吗?
我需要使用跨平台库来控制子进程。我发现的唯一成熟的推荐库是boost::process,但我是 Boost 的新手。
我只想使用这个库,但我不确定我该怎么做以及是否有其他依赖项,即我是否还需要编译另一个库或者它只是标题?我的最终目标是尽可能少地使用 Boost。我应该怎么做?
c++ - 终止进程的Boost进程退出代码
终止进程的返回码应该是什么?我边跑边"bash -c \"while true; do true; done\""
打电话terminate
。在 boost 1.65 中是这样0
,现在在 boost 1.71 中是383
。
c++ - Boost Process 1.71 不再查看环境路径
我一直在用boost 1.65,没改代码,更新boost到1.71版本,现在突然boost::process::child("command-in-path")
不继承执行进程的环境了。如何恢复行为,是否可以不每次都解析命令以在路径中找到可执行文件?
c++ - boost::process 如何正确读取进程 std::cout 和 std::cerr 并保持顺序
我正在通过boost::process
. 该过程使用std::cout
和std::cerr
来输出一些信息。我需要检索这些信息。在某些时候,我希望能够存储那些保留顺序和严重性的输出(来自cout
or的输出cerr
)。
boost::process
但考虑到重定向输出的方式,我无法做到这一点。我只能重定向std::cout
到一个特定的 ipstream 和std::cerr
另一个。然后,在阅读它们时,我无法保留顺序。
这是一个 MCVE 隔离问题:
当我执行这个程序(在 Windows 10 下使用 Visual Studio 2019 编译)时,它输出:
虽然我想要:
有没有办法做到这一点?
编辑,正如一些程序员花花公子所建议的那样,为每个输出流创建了一个线程:
然后输出是:
还是出乎意料...
c++ - 无法通过 boost::process 找到 gstreamer 插件
我正在尝试使用 boost::process 加载 gstreamer 插件来调用gst-launch
.
当我通过命令行加载插件时,一切正常:
如果我使用可执行文件的完整路径,它也可以正常工作:
但是如果我尝试在路径中找到可执行文件并将参数作为单独的参数发送到bp::child
,则 gstreamer 无法找到插件:
我缺少什么特定于参数处理的东西吗?
c++ - 当一个进程以 ```boost::process``` 结束时如何等待?
我有主程序和系统窗口计算器。我想从主程序运行计算器,然后等待用户关闭它,然后放弃对主程序的控制。
我尝试这个解决方案:
和
并且在这两种方式中,计算器都会启动,但主进程不要等到孩子关闭并跑得更远。
我应该怎么做?
c++ - 有没有办法记录通过 boost::process::spawn 创建的进程的输出?
我知道有一种 boost::process::child 的方法,如下所述:
这可以在调用 boost::process::spawn 时工作还是我必须使用 boost::process::child 来这样做?