我有一个我在C++中构建的嵌入式Linux项目。arch是arm,处理器是freescale 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的结果是不够的,因为有可能我有2个相同的声音运行两次。
提前感谢你的聪明才智。
克里斯
更新:
我成功了。我使用fork(),在子函数中它简单地称为execlp()。
在父进程中,我记录了子进程的PID。
最后,我创建了一个线程,使用waitforpid(WNOHANG)来监视所有fork的状态,以保持信息的更新。
最佳答案
$!
只有当同一个shell启动程序时才能起作用,而您随后在其中计算$!
。每次使用system
都调用自己的shell。从手册页:system()
通过调用/bin/sh -c command
执行命令中指定的命令,并在命令完成后返回。
你用错了方法。相反,学习使用fork()
和exec
家族中的一个函数,外加一个wait
。fork()
将为您提供正确的pid。