如何从内核模块向用户空间应用程序发送“信号”?

Posted

技术标签:

【中文标题】如何从内核模块向用户空间应用程序发送“信号”?【英文标题】:How to send a "signal" from kernel module to user-space application? 【发布时间】:2013-06-02 20:50:03 【问题描述】:

我有一个包含中断处理程序的 Linux 内核模块,并且想在处理中断后以某种方式通知用户空间应用程序。请告诉我,怎么做?

【问题讨论】:

我们可以假设您在谈论 Linux 吗?无论哪种方式,请在您的问题中添加相关标签。 @OliCharlesworth 是的,我们在谈论 Linux,但我的标签用完了 您可以,例如,删除“硬件”以支持“linux”。硬件知识对于回答这个问题并不重要。 @chirlu 好的,我做到了。请让我们回到问题 标签对于让合适的人查看您的问题很重要。看?答案来了。 :-) 【参考方案1】: 您始终可以使用普通套接字,例如 UDP 或 UNIX。 您可以通过/proc/sys 导出此信息(请参阅this 问题)。 您可以使用 Netlink(请参阅this 问题)。

【讨论】:

消息队列,还是共享内存? 您也可以对用户空间使用信号 :).. 您的内核模块应该知道的只有需要触发的进程的 PID。我已经使用 IOCTL 到内核模块来传递 PID :)。【参考方案2】:

使用netlink。

Netlink socket 是一种特殊的 IPC,用于传输信息 内核和用户空间进程之间。它提供了一个全双工 两者之间通过标准套接字 API 进行通信链接 用户空间进程和内核模块的特殊内核 API。 Netlink 套接字使用地址族 AF_NETLINK,与 TCP/IP 套接字使用的 AF_INET。每个 netlink 套接字功能都定义了它的 内核头文件include/linux/netlink.h中自己的协议类型。

【讨论】:

【参考方案3】:

我直接回答这个问题,因为它是 Google 中“内核向用户空间发送信号”的最高结果。

我通常使用信号来终止用户空间进程,以在调用 ioctls 时检查它的堆栈。通常以下对我有用:

force_sig(SIGSEGV, current);

【讨论】:

以上是关于如何从内核模块向用户空间应用程序发送“信号”?的主要内容,如果未能解决你的问题,请参考以下文章

cpu 如何向内核发送有关硬件异常的信号?

Linux进程信号

Linux进程信号

uevent 从内核发送到用户空间 (udev)

Linux进程信号

linux 信号处理