信号无法唤醒睡眠过程

时间:2019-04-11 11:56:53

标签: c linux process scheduled-tasks

我正在从事一个需要照顾流程安排的项目。我试图通过发送SIGINT信号(ctrl + c)来停止某些进程,但是我发现睡眠进程不会唤醒。 我解决了这个奇怪的问题,但是找不到SIGINT信号为什么不能唤醒睡眠过程。

这是我的原始代码(进程卡住了):

            set_current_state(TASK_INTERRUPTIBLE);
            while (!item->assigned) {
                schedule_timeout(2*HZ);
               set_current_state(TASK_INTERRUPTIBLE);
            }
            set_current_state(TASK_RUNNING);

因此,在while循环内部,当!item->assigned仍为1时,即使将进程的状态设置为TASK_INTERRUPTIBLE,SIGINT信号也不执行任何操作。

据我所知,过程通过以下方式处理信号:

  
      
  1. 执行信号默认操作
  2.   
  3. 阻止信号设置信号屏蔽(通过系统调用sigmask完成)
  4.   
  5. 为信号分配自定义处理程序,执行自定义操作(使用系统调用信号)
  6.   

所以在这种情况下,我假设它将执行默认操作。

我添加了signal_pending(current),以检查是否有任何未决信号,如果存在,则跳出循环,以便进程可以处理未决信号。

            set_current_state(TASK_INTERRUPTIBLE);
            while (!item->assigned) {
                schedule_timeout(2*HZ);
                if (signal_pending(current))
                {

                    break;
                }
                set_current_state(TASK_INTERRUPTIBLE);
            }
            set_current_state(TASK_RUNNING);

但是仍然不知道为什么它没有捕获SIGINT信号。

0 个答案:

没有答案