gpt4 book ai didi

c++ - 无法从 C++ 应用程序正确生成 Raspberry Pi 相机应用程序作为子进程

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:38 24 4
gpt4 key购买 nike

我正在使用 C++ 在 Raspberry Pi/Raspbian 上编写应用程序。我使用 mkfifo() 创建命名管道 (FIFO),然后启动 raspiyuv 从我的相机中抓取图像。对于内存,raspiyuv 是 Raspberry Pi 命令行应用程序,它可以拍摄静止图像并将它们保存为 YUV 文件。

我在 -std=c++17 中使用 g++ 6.3 和 Boost 1.64。我创建的 FIFO 是正确的,因为我可以从命令行使用它。它按预期工作。

错误是我生成的应用程序 raspiyuv 立即返回,退出代码为 0

我的代码:

void myFunction()
{
// Create the FIFO here with mkfifo(); // Works fine...
boost::filesystem::path lExecPath =
boost::process::search_path( "raspiyuv" ); // returns correct path
boost::process::child lProcess( lExecPath, "-w 2592 -h 1944 -o - -t 0 -y -s >> /var/tmp/myfifo" );
int lPID = lProcess.id(); // Seems to be correct
int lExitCode = lProcess.exit_code(); // Returns immediately with 0
}

命令$ raspiyuv -w 2592 -h 1944 -o - -t 0 -y -s我直接在命令行输入是正确的。此外,重定向到 FIFO 工作正常。 -w 2592 -h 1944给出抓取图片的大小,-o -表示输出图片到stdout,-t 0表示永远等待,-y表示只保存Y channel ,-s表示等待SIGUSR1触发图像采集。

当我从命令行调用它时,应用程序处于空闲状态,直到我发送 SIGUSR1,然后它捕获图像并将其流式传输到 FIFO,然后返回空闲状态。没关系。

当我通过创建 boost::process::child 对象生成它时,它会立即返回。

任何纠正此问题并允许 boost::process::child 保持事件状态的想法,只要我的应用程序(父进程)处于事件状态并且我不发送 SIGKILL 等。 ?

感谢您的帮助!

最佳答案

boost::process::child 异步运行到主进程。如果您想要同步行为,那么您必须调用 lProcess.wait()或通过同步方式启动 raspiyuv,例如使用 boost::process::system

编辑:如果您希望其他进程是异步的(正如您的编辑和评论似乎表明的那样),那么您真正尝试做的事情对我来说变得不清楚:

The bug is that the application raspiyuv I spawn returns immediately with exit code 0.

什么错误?通过 docs of boost::process::child完全是预期的:

  1. int exit_code() const; Get the exit_code. The return value is without any meaning if the child wasn't waited for or if it was terminated.

您的代码无处等待子进程结束,因此会像记录的那样获得退出代码。

关于c++ - 无法从 C++ 应用程序正确生成 Raspberry Pi 相机应用程序作为子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46680539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com