2016-07-11 54 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