2014-03-13 23 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' –