2014-03-13 25 views
0

我有一个嵌入式linux项目,我用C++编写。拱门是手臂,处理器是一个飞思卡尔imx6。从C++应用程序中确定最后一个背景pid

我使用运行多个音频文件中的背景: 的sprintf(sysdev “GST-发射playbin2 URI =文件://%S音频宿=” “alsasink设备= ossmix” “&”,文件名) ; 然后执行:system(sysdev) 我也试过使用execvp。

当我看到$:的结果后!

这一切都在控制台中运行良好,但在C++程序中,$!没有返回结果。我实际上使用:echo $! result.dat将结果导入到在程序中读取的文件中。问题在于,在程序中,result.dat永远不会获取数据......而且很显然,这是因为$!没有返回任何东西。

我想这与环境有关。

首先,我的方法是否可行?

我非常新的Linux,但我的理解是,我不能“问题”一个PID的节目我跑,所以我唯一的选择是要弄清楚我一直在考虑,因为它们发生的人。

只需扫描PS的结果不会是足够的,因为有我可能需要在运行两次相同的声音的2的可能性。

预先感谢所有的智力。 克里斯

更新: 我得到它的工作。我使用了fork(),并且在子代中它简单地称为execlp()。 在家长,我登录了孩子的PID。 最后,我创建了一个线程,使用waitforpid(WNOHANG)监视所有分支的状态以保持信息更新。

+0

阅读[高级Linux编程](http://advancedlinuxprogramming.com/);它有一个关于流程的好章节。 –

回答

1

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

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

您在这里使用了错误的方法。相反,学会使用fork()exec系列的功能之一,再加上waitfork()会给你正确的PID。

+0

好的,但是因为我都是在调用原始播放器和$!从我的程序中,不会被认为是同一个shell?关于fork(),我一直有点担心要使用它,因为它会为我的程序创建一个完整的内存拷贝,这看起来像是极其重要的,尤其是运行多个叉和我的嵌入式系统。我看着这个错误吗? – user3417173

+1

'system'的每次使用都调用它自己的shell。将更多的信息修改这个问题。 – abligh

+0

当然'system'做了'/ bin/sh'的'fork'和'execve' –