我正在用 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 等,任何想法来纠正这个问题并允许它保持活跃?
谢谢你的帮助!