如何将内核模块中的自定义Linux信号广播到所有正在运行的进程

我编写了一个内核模块,它向用户空间提供有关硬件中断的一些信息。 目前,用户空间应用程序使用IOCTL将其PID x发送到内核模块。 然后内核模块使用此PID查找任务并发送信号:

 #define CUSTOM_SIGNAL 44 struct siginfo info; memset(&info, 0, sizeof(struct siginfo)); info.si_signo = CUSTOM_SIGNAL; info.si_code = SI_QUEUE; info.si_int = 0; struct task_struct *t = pid_task(find_pid_ns(x, &init_pid_ns), PIDTYPE_PID); send_sig_info(CUSTOM_SIGNAL, &info, t); 

这非常有效。 但是,我发现维护单个信号的PID接收器动态列表相当棘手。 出于这个原因,我想广播信号默认为所有正在运行的进程(所以他们不需要注册通知 – 它只是发生)。

我能想到的一个模仿这种行为的例子是系统关闭信号。 是否可以简单地广播我的CUSTOM_SIGNAL,或者我是否需要迭代所有PID,如上所述逐个发送。 或者是否有代表广播的特殊任务?

这是彻头彻尾的错误。

我编写了一个内核模块,它向用户空间提供有关硬件中断的一些信息。 目前,用户空间应用程序使用IOCTL将其PID x发送到内核模块。 然后内核模块使用该PID来查找任务并发送信号

首先,您可以通过current访问调用线程任务结构。 获得这样的PID然后找到它没有任何意义。

此外,您的代码示例建议您不要锁定RCU,如果您启用了调试,这将是您将学习的错误。

这非常有效。 但是,我发现维护单个信号的PID接收器动态列表相当棘手。 出于这个原因,我想广播信号默认为所有正在运行的进程(所以他们不需要注册通知 – 它只是发生)。

这在其原则上同样是错误的。 你会引起虚假的唤醒,这有可能带来很多奇怪的屁股乐趣(不是所有东西都像人们想象的那样’primefaces’)。

而是创建一个可以获取文件描述符的设备驱动程序。 感兴趣的线程将轮询描述符,这就是他们将如何了解该事件。