2010-07-21 159 views
1

我需要從我的linux守護進程運行一個linux命令,例如「df」來知道可用空間,已用空間,parition的總大小以及其他信息。我有一個像呼叫系統,EXEC,POPEN等選項..從Daemon運行Linux命令

  1. 但因爲這每個命令產生新的進程,這是不可能運行從調用它在同一個進程中的命令?

  2. 與此同時,我需要從一個Linux守護進程運行這個命令,因爲我的守護進程不應該持有任何終端。它會影響我的守護進程行爲嗎?

或者是它們的任何C或C++標準用於獲取安裝paritions信息

回答

4

沒有標準 API的API,因爲這是一個特定於操作系統的概念。

然而,

  1. 您可以分析/proc/mounts(或/etc/mtab)與(非便攜式)getmntent/getmntent_r輔助功能。
  2. 使用關於已掛載文件系統的信息,您可以使用statfs獲取其統計信息。
+0

這也將提供有關免費和已用空間的信息 – Poorna 2010-07-21 03:41:35

+0

@siri,我用更好的選項更新了答案(是的,它會)。 – 2010-07-21 03:52:48

+0

我只想確認從守護進程運行命令是對還是錯,以及它可能產生的副作用 – Poorna 2010-07-21 04:01:37

1

你可能會發現,探索i3status程序的源代碼:http://code.stapelberg.de/git/i3status/tree/src/print_disk_info.c

爲了回答您的其他問題:

但因爲這每一個命令產生新的進程,這是不可能的在調用它的同一個進程中運行這些命令?

否;完整的'命令'是自包含的程序,必須在自己的過程中運行。

取決於你希望執行你的程序的頻率,fork();exec()並不是那麼糟糕。除了執行幫助程序之外,您自己收集數據會更好。一分鐘,你可能正在執行命令。每秒一次,你可能會更好地自己收集數據。我不確定分界線在哪裏。

與此同時,我需要從一個Linux守護進程運行這個命令,因爲我的守護進程不應該持有任何終端。它會影響我的守護進程行爲嗎?

如果命令調用setsid(2),然後在終端上open(2)而不包括O_NOCTTY,該終端might成爲該過程控制終端。但是這不會影響你的程序,因爲你的程序在成爲守護進程時已經拒絕了終端,並且由於子進程是會話負責人,所以它不能更改進程的控制終端。