c - 阻塞的系统调用不会让 SIGKILL 终止进程

标签 c linux kernel block system-calls

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

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

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

如果我在主线程的 while 循环中放置以下代码,它会正确捕获信号并退出。如果我只在 thread1 的 while 循环中放入 following,主线程仍然不会退出。

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)
   }
}

问候,

索尼卡

最佳答案

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

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

由于您的系统调用永远不会返回,所以这永远不会发生。

换句话说:您无法真正杀死 Linux 进程。你可以礼貌地让它死掉。

关于c - 阻塞的系统调用不会让 SIGKILL 终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16331536/

相关文章:

c - 无限循环链表

linux - 使用curl shell脚本登录后上传文件

linux - 需要用一个变量比较两个字符串

linux-kernel - 在 IO 系统中保存信息

python - 无法在 Azure Data Studio 中将内核更改为 Python

c - 不断得到 0.00 作为答案

c - 使用C标准数学库精确计算标准正态分布的PDF

c - 为什么我不能在 pow() 函数中使用整数?

linux - 哪个.SO Linux有RAM信息

c - 参数未传递给 c 内核中的函数