2016-07-11 51 views
1

我是新的C++。我的問題是我有一個創建很多進程的進程,我想識別其中一個子進程(獲得pid)。循環使用兒童需要大量資源(不要問爲什麼)。所以我試圖通過(不知何故)確定它是否使用sd_notify並獲得pid(如果可能的話,我現在不會真正實現)來獲取進程的PID。我使用Ubuntu 14.04,創造了小測試程序:C++:未定義引用'sd_notify'

#include <systemd/sd-daemon.h> 
#include <stdio.h> 

int main() 
{ 
    int a; 
    a = sd_notify(0, "READY=1"); 
    printf("%d -> \n", a); 
    fflush(stdout); 
} 

但它給了我錯誤說undefined reference to 'sd_notify'

P.S 我發現sd_notify是systemd系統。在新貴系統中,這相當於什麼?或者我怎樣才能確保我搜索的過程不使用這個功能?或者是否可以使用sd_notify記錄進程發送的所有消息?

+0

似乎有點像[在XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy - 問題) - 你爲什麼相信你能夠通過使用'sd_notify'來識別一個進程?爲什麼你需要得到這個特定孩子的PID? – davmac

+0

我真正想要的是,我以用戶A的身份登錄,以用戶B的身份創建進程,並且該進程爲用戶B創建會話('/ etc/X11/Xsession'gnome-session --session = ubuntu'')我試圖從用戶B的會話過程中註銷dbus連接名稱(來自dbus-daemon --session)並註銷用戶。 – Rasty

+0

好的,那麼這就是你應該問的問題。 :)(並且添加了很多細節,因爲有很多事情仍然不清楚你正在做什麼的限制。爲什麼不使用標準DBus API(systemd或consolekit)來定位會話?) – davmac

回答

3

嘗試安裝libsystemd-daemon-devel然後編譯使用

g++ -o sig sig.cpp -lsystemd-daemon

+0

非常感謝,它的工作。請告訴我是否有可能使用sd_notify記錄進程發送的所有消息?或者它放在任何它被記錄的地方?再次感謝。 – Rasty

+1

@美味我以前沒有使用過這個庫,所以無法評論。建議你就此提出另一個問題。如果它幫助你,請接受這個答案。謝謝! – alasin

+0

'sudo apt-get install libsystemd-dev'並追加'-lsystemd'工作於kubuntu 16.04。 –

0

您在編譯時沒有鏈接到所需的庫。嘗試將選項-lsystemd添加到編譯命令行中。

+0

對不起,我忘了提及,我正在使用'g ++ -o sig sig.cpp -l systemd' – Rasty

+1

沒有空格 - '-lsystemd' - 是常規的(不知道它是否真的有必要)。 – davmac

+1

空間或沒有空間沒有區別,都允許 – Smeeheey