从c ++ app中确定最后一个背景pid

时间:2014-03-13 19:59:14

标签: c linux background arm pid

我有一个用C ++构建的嵌入式linux项目。拱是手臂,处理器是飞思卡尔imx6。

我在后台运行多个音频文件: sprintf(sysdev," gst-launch playbin2 uri = file://%s audio-sink ="" alsasink device = ossmix""&",文件名); 然后执行:system(sysdev) 我也尝试过使用execvp。

我读完结果后:$!

这一切在控制台中运行良好,但在c ++程序中,$!没有返回结果。我实际上使用:echo $! &安培;> result.dat将结果通过管道传输到程序中读取的文件中。问题是在程序中,result.dat永远不会得到数据......而且很明显,因为$!不归还任何东西。

我猜这与环境有关。

首先,我的方法可行吗?

我对Linux很陌生,但我的理解是我不能发布'我运行的程序的PID,所以我唯一的选择就是找出我发生的那些程序。

只是扫描ps的结果是不够的,因为我可能有两次相同的声音运行两次。

提前感谢所有的智力。 克里斯

更新: 我搞定了。我使用了fork(),在子节点中它只调用了execlp()。 在父母中,我记录了孩子的PID。 最后,我创建了一个线程,使用waitforpid(WNOHANG)监视所有分支的状态以保持信息更新。

1 个答案:

答案 0 :(得分:1)

$!仅在相同的shell启动程序时才会起作用,因为该程序随后会评估$!system的每次使用都会调用自己的shell。从手册页:

  

system()通过调用/bin/sh -c command执行命令中指定的命令,并在命令完成后返回。

你在这里使用了错误的方法。相反,请学会使用fork()exec系列中的一个功能,以及waitfork()将为您提供正确的pid。