被阻止的系统调用不会让SIGKILL终止进程

时间:2013-05-02 06:16:18

标签: c linux kernel block system-calls

我有一个关于内核线程之间信号传播的查询。 场景是这样的:

从用户空间应用程序进行系统调用,内核在系统调用中创建一个线程(让它命名为thread1)。

现在在thread1内部,内核在while循环中循环并被阻塞。主线程也在while循环中循环。 如果我执行“kill -9<”用户应用程序pid>“,则应用程序无法正常退出。即使/ proc条目仍然存在。 虽然/ proc // fd文件夹变空了。

如果我在主线程的while循环中放入跟随,它会正确捕获信号并退出。如果我只在thread1的while循环中添加以下内容,则主线程仍然不会退出。

if (signal_pending(current)) {
  return;
}

请你建议,在这种kill -9信号的情况下内核应该如何表现?在SIGKILL之后,该过程的状态变为Zombie。

系统调用具有以下实现:

thread1 = kthread_create(thread_fn, NULL, "thread1");
if (thread1) {
    wake_up_process(thread1);
}
printk(KERN_NOTICE "Main thread: current:%s\n", current->comm);
while(1) {
    DELAY_SEC(1)

thread_fn是:

int thread_fn(void* data)
{
    while(1) {
        DELAY_SEC(1)
   }
}

此致

索尼卡

1 个答案:

答案 0 :(得分:3)

向进程发送信号只是为该信号设置了相应的标志。

当进程从内核模式返回时(例如,当系统调用返回时),将检查这些标志。如果之前设置了其中一个,则采取相应的措施。

由于您的系统调用永远不会返回,因此不会发生这种情况。

换句话说:你无法真正杀死Linux进程。你可以礼貌地要求它去世。

相关问题