【问题标题】:undefined reference to `sd_notify'未定义对“sd_notify”的引用
【发布时间】:2016-07-11 08:58:30
【问题描述】:

我有一个创建很多进程的进程,我想识别(获取 pid)其中一个孩子。遍历孩子会占用大量资源(不要问为什么)。所以我试图通过(以某种方式)识别它是否使用sd_notify 并获取pid(如果可能的话,我现在不知道)来获取进程的pid。我正在使用 ubuntu 14.04 并创建了一个小测试程序:

#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' 时出错。

附言 我发现sd_notify 是针对 systemd 系统的。在新贵系统中,这相当于什么?或者如何确保我正在搜索的进程不使用此功能?或者是否可以使用sd_notify 记录进程发送的所有消息?

【问题讨论】:

  • 看起来有点像 [XY 问题] (meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - 为什么你相信你能够识别一个进程仅仅因为它使用了sd_notify?为什么你需要得到这个特定孩子的 PID?
  • 我实际上正在尝试的是,我以用户 A 身份登录,以用户 B 身份创建进程,并且该进程为用户 B 创建会话,(/etc/X11/Xsession 'gnome-session --session=ubuntu')我正在尝试从用户 B 的会话进程中获取 dbus 连接名称(来自 dbus-daemon --session)并注销用户。
  • 好的,那么这就是你应该问的问题。 :) (并且添加了很多细节,因为还有很多事情仍然不清楚您正在做的事情的局限性。为什么不使用标准的 DBus API - systemd 或 consolekit - 来定位会话?)跨度>
  • 我正在尝试让我的程序在每个发行版(systemd,upstart init)上运行。我还没有尝试使用任何 API。所以你认为这种方法不会帮助我识别pid?
  • 或者您能否提供我如何获取 pid 或使用 Consolekit 注销其他用户?

标签: c++ linux ubuntu notifications


【解决方案1】:

尝试安装libsystemd-daemon-devel,然后使用编译

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

【讨论】:

  • 非常感谢,它成功了。您能否告诉我是否可以使用 sd_notify 记录进程发送的所有消息?还是它被记录在任何地方?再次感谢。
  • @Rasty 我之前没有使用过这个库,所以无法发表评论。建议您为此提出另一个问题。如果对您有帮助,请接受此答案。谢谢!
  • 对我来说 sudo apt-get install libsystemd-dev 并附加 -lsystemd 在 kubuntu 16.04 上工作。
【解决方案2】:

您没有在编译时链接到所需的库。尝试将选项 -lsystemd 添加到您的编译命令行。

【讨论】:

  • 抱歉我忘了说,我用的是g++ -o sig sig.cpp -l systemd
  • 没有空格 - -lsystemd - 是常规的(不确定是否真的有必要)。
  • 空格或没有空格没有区别,都允许
猜你喜欢
  • 2011-03-27
  • 2022-01-22
  • 2016-04-04
  • 2015-11-03
  • 2011-08-11
  • 2019-07-22
  • 2015-07-20
  • 2019-06-22
  • 2012-04-02
相关资源
最近更新 更多