gpt4 book ai didi

c - 启用 linux 服务以显示弹出窗口

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:45 24 4
gpt4 key购买 nike

我使用 C 语言开发了一个 IP 信使,我希望分享它的一些实现细节,以便完全理解我的问题。

  1. 使用 GTK+-2.0 库显示 GUI 窗口。
  2. 它有一个监听套接字,每当有新连接到达时,它就会创建一个新进程来为该连接提供服务。
  3. 每当有新消息到达时,它将显示一个 GUI 窗口来显示收到的消息(如弹出窗口)。
  4. 它需要 root 权限才能运行,因为它使用原始套接字发送 ICMP 回显数据包来识别本地网络中的可用主机。 (RAW套接字需要 super 权限)
  5. 该进程被妖魔化,因此它将在后台运行并仅在收到消息时显示弹出窗口。
  6. 我的机器是 CentOS 6.9

当我从终端开始这个过程时,一切都很完美。但是后来我通过在 /etc/init.d/ 目录中添加启动脚本,为该程序创建了一个启动条目以将其作为服务运行。然后我使用服务命令启动了我的服务,

 # service ipmsnger start

现在我可以使用 ps 命令看到进程正在运行。但如果消息到达,它不会显示弹出窗口。消息发件人从信使那里获得成功发送报告。会是什么原因?用户从终端启动恶魔进程与系统将其作为启动服务启动有什么区别?

最佳答案

我对 init.d 不是很熟悉,因为现在 systemd 更常见。我假设您运行的是 X11 而不是 Wayland。

要么使用CAP_NET_RAW并以应显示对话框的用户身份运行您的程序。

或者以root身份运行程序,显示的时候换成要显示的用户的UID。您还必须设置 DISPLAY主要是 :0DBUS_SESSION_BUS_ADDRESSunix:path=/run/user/<UID of user to display to>/bus


libnotify 示例。

#include <libnotify/notify.h>
#include <unistd.h>
#include <errno.h>

int main(void) {
if (getuid() != (uid_t)1000 && setuid(1000) == -1) {
perror("setuid");
return -1;
}
if (setenv("DISPLAY", ":0", 0) == -1) {
perror("setenv DISPLAY");
return-1;
} // guessing 1000 as UID
if (setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/run/user/1000/bus", 1) == -1) {
perror("setenv DBUS");
return-1;
}

notify_init ("Hello world!");
NotifyNotification * Hello = notify_notification_new("Hello world",
"This is an example notification.", "dialog-information");
notify_notification_show(Hello, NULL);

g_object_unref(G_OBJECT(Hello));
notify_uninit();

return 0;
}

关于c - 启用 linux 服务以显示弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52006618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com