【问题标题】:How to send broadcast message to console in Linux from C program如何从 C 程序向 Linux 中的控制台发送广播消息
【发布时间】:2014-02-21 02:00:14
【问题描述】:

我已经用 C 语言编写了一个在 Linux 上工作的守护进程,现在我需要能够像逗号“墙”那样向 Linux 控制台发送短消息,或者 init 在重新启动系统时的作用。

如何在我的程序中做到这一点?

最好的问候

马雷克

【问题讨论】:

  • 您是否考虑过使用syslog(3) 并配置您的syslogd 以在控制台上显示它?
  • 是的,我刚才听说的一个选项,想避免这种情况,因为有 4 个不同的 syslog 守护进程,如 syslog-ng、rsyslog...
  • 将系统日志守护进程的配置留给系统管理员。但要准确记录您的软件是如何使用syslog(3) 的;此外,有些系统没有人类监视的控制台......

标签: c linux init


【解决方案1】:

当前的控制台linux设备是/dev/console,但是你需要root才能写入这个文件。 有关更多信息,请参阅控制台的手册页,但这里是摘录:

在控制台上启动进程的常用方法有:

  • (a) 告诉 init(8)(在 inittab(5) 中)启动一个 mingetty(8)(或 agetty(8)) 在控制台上;
  • (b) 要求 openvt(1) 在 控制台;
  • (c) 启动 X — 它将找到第一个未使用的控制台,并且 在那里显示它的输出。(还有古老的 doshell(8)。)

【讨论】:

    【解决方案2】:

    要将消息发送到多个终端/控制台,请在各种 tty 节点上使用 ttymsg()

    有关如何使用 C 程序的一个很好的例子,请查看source of the walk command。我们可以准确地看到它是如何准备一个消息缓冲区并将其作为广播发送到所有当前登录用户的各个终端的。

    【讨论】:

    • ttymsg 通常不在 Linux 中:不在 libc 中,在 Linux 的手册页中没有记录。似乎是特定于 BSD 的!
    • ttymsg() 可通过在您的程序中添加 #include <ttymsg.h> 来使用。它是libutil which is available on debian 的一部分。
    • 找不到 ttymsg.h packages.debian.org/…
    • 嗯,对!您可能只需在程序char *ttymsg(struct iovec *iov, int iovcnt, char *line, int tmout); 中添加这一行来声明外部函数即可。确保在构建程序时与 libutil 建立链接。
    • ...或者,可以继续简单地添加ttymsg() 的实现,就像在这个project 中所做的那样。
    【解决方案3】:

    对于偶尔发送短消息,最好(最便携、最简单)的方法就是运行 wall(1)。

    【讨论】:

    • ...可以查看this answer 以从我们的常规 C 程序以 root 身份运行命令(在本例中为 wall)。
    【解决方案4】:

    我想避免从我的程序中执行其他二进制文件。 使用 ttymsg 和墙程序代码的解决方案对我来说效果很好。

    感谢您的帮助 马立克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2013-02-15
      • 2017-03-12
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2021-06-09
      • 2014-11-29
      相关资源
      最近更新 更多