【问题标题】:Killing a userspace program from a kernel module从内核模块中杀死用户空间程序
【发布时间】:2016-04-12 19:03:36
【问题描述】:

我只是想知道是否有办法从内核模块中杀死用户空间程序。我知道 kill 命令不起作用,因为它是从用户空间到内核空间的系统调用。

【问题讨论】:

标签: c linux-kernel kernel-module


【解决方案1】:

这段代码会杀死调用进程...

int signum = SIGKILL;
task = current;
struct siginfo info;
memset(&info, 0, sizeof(struct siginfo));
info.si_signo = signum;
int ret = send_sig_info(signum, &info, task);
if (ret < 0) {
  printk(KERN_INFO "error sending signal\n");
}

你可以在这里看到OOM杀手是如何做到的......

http://lxr.free-electrons.com/source/mm/oom_kill.c?v=3.16#L516

【讨论】:

  • 如果我知道用户空间程序的名称,例如“xyz”,我想从内核模块向该进程发送信号。看起来上面的代码杀死了当前进程。
  • 你需要找到task,然后给它发送信号。
  • 您应该使用 send_sig_info(SIGKILL, SEND_SIG_PRIV, task); 使用 SEND_SIG_PRIV 还可以避免检查较新的内核,这些内核使用 kernel_siginfo 而不是 siginfo
【解决方案2】:

如果您知道用户空间可以使用哪些系统调用来传递信号,为什么不检查它是如何实现的?更重要的是,为什么您认为首先需要发送信号?首先,您如何确定要发出什么信号?

这是另一个可怕的大学作业吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多