0

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

我正在使用 g++ 6.3 和 Boost 1.64 和-std=c++17。我创建的 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 -表示将图像输出到标准输出,-t 0表示永远等待,-y表示仅保存 Y 通道,-s表示等待 SIGUSR1 触发图像捕获。

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

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

boost::process::child只要我的应用程序(父进程)还活着并且我不发送 SIGKILL 等,任何想法来纠正这个问题并允许它保持活跃?

谢谢你的帮助!

4

1 回答 1

0

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

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

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

什么毛病?通过它文档boost::process::child正是预期的:

  1. int exit_code() 常量;获取 exit_code。如果孩子没有被等待或被终止,则返回值没有任何意义。

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

于 2017-10-11T05:43:24.863 回答