我正在将 4 个专有(阅读:非 GPL)Linux 内核驱动程序(我没有编写)从 RHEL 5.x 移植到 RHEL 6.x(2.6.32 内核)。驱动程序都使用 kill_proc() 来发出用户空间“会话”的信号,但是这个函数已从更新的内核(2.6.18 和 2.6.32 之间的某个位置)中删除。我已经看到这个问题在这里和其他地方被问过很多次,并且我已经进行了相当广泛的搜索,但是在许多建议的解决方案中,由于不再导出函数或需要仅 GPL 的函数(见下文) . 有谁知道适用于专有驱动程序的解决方案?
给定:kill_proc(pid, sig, 1);
我找到的最简单的解决方案是使用: kill_proc_info(sig, SEND_SIG_PRIV, pid); 但是 kill_proc_info 不再导出,因此无法使用。
建议使用 kill_pid_info()(在设置 rcu_read_lock() 后由 kill_proc_info() 调用。kill_pid_info() 需要 struct pid* 所以我可以使用:kill_pid_info(sig, SEND_SIG_PRIV, find_vpid(pid)); 但是 find_vpid()仅导出为 GPL 使用,这是一个专有驱动程序。还有其他方法可以获取 struct pid* 吗?
kill_pid_info() 也设置一个 rcu_read_lock() 然后调用 group_send_sig_info()。不幸的是,group_send_siginfo() 没有导出,而且它需要一个 struct task_struct*,但所需的 find_task_by_vpid() 函数也没有导出。
另一个建议是 kill_pid(),但这也需要一个 struct pid*,同样,函数 find_vpid() 只为 GPL 导出。
也有关于 send_sig() 和 send_sig_info() 的建议,但这些也需要一个 struct task_struct*,同样,find_task_by_pid() 不会导出,pid_task() 需要 (GPLd) find_vpid() 来获取一个 struct pid* . 此外,这些函数没有设置 rcu_read_lock() 并且它们还为组标志传递了一个 FALSE 值(而 kill_proc 最终使用了一个 TRUE 值) - 所以可能存在一些细微的差异。
这就是我能找到的一切。有没有人有适合我的情况的建议?提前致谢。