2013-08-26 40 views
1

我怎麼知道,如果一個進程已經完成了它的執行沒有任何錯誤? 如何知道,如果C++程序已成功返回到操作系統?Linux,系統守護進程和其他進程存儲的返回代碼在哪裏?

如果我通過shell運行它,那麼我可以使用$?,但是如果我正在檢查由其他用戶啓動的進程的狀態,我如何檢查狀態?

假設我在早上開始了一個過程,並且在中午終止了。我一直在做一些其他活動的工作,直到晚上,並且在離開之前,我想檢查哪些進程已返回到操作系統。我怎麼能以編程方式實現這一點。通過系統日誌運行會有所幫助,但尋找替代方案。

我可以運行OS的進程表並讀取這些信息,但是對於我的需求來說聽起來有點複雜。我們是否有類似syslog的東西,其中記錄了所有進程錯誤?

任何其他方式來檢索(其他用戶的)終止進程報告的錯誤?

+0

剛剛將進程封裝到shell腳本或將程序寫入文件系統的C程序中呢?然後您可以修改調用程序來執行腳本,而不是直接執行該過程。也就是說,如果你沒有這些類型的權限可能會很困難。 – beta

+0

我無法爲所有系統進程做到這一點。另外,我正試圖獲取其他用戶也調用的進程的返回值。我不能堅持所有包裝在腳本中。 – kris123456

回答

3

當進程終止其父進程時,必須使用waitwaitpid函數來確認。這些函數也會返回退出狀態。在撥打waitwaitpid後,進程表條目被刪除,並且退出狀態不再存儲在操作系統中的任何位置。您應該檢查用於啓動進程的軟件是否在某處保存退出狀態。

如果父進程尚未確認子進程已終止,則可以從/proc文件系統讀取其退出狀態:它是/proc/[pid]/stat中的最後一個字段。它的存儲格式與wait返回的格式相同,因此您必須除以256才能獲得退出代碼。你也許必須成爲根。

+0

IIRC你可以讀取該文件,如果你是與進程相同的uid或'root'。 – nneonneo

+0

您可以閱讀該文件,但需要額外的權限才能看到退出代碼。請參閱在'do_task_stat'函數中設置'allowed'的測試:https://github.com/torvalds/linux/blob/master/fs/proc/array.c您是否知道如何獲得額外權限根? – Joni

+0

我認爲擁有相同的'uid/gid'會自動授予這些權限;請參閱http://lxr.free-electrons.com/source/kernel/ptrace.c#L225 – nneonneo