gpt4 book ai didi

linux - 系统调用如何被信号中断?

转载 作者:IT王子 更新时间:2023-10-29 00:38:56 28 4
gpt4 key购买 nike

我的理解是这样的:

阻塞系统调用通常会将进程置于“TASK_INTERRUPTIBLE”状态,以便在传递信号时,内核将进程置于“TASK_RUNNING”状态。并且该进程将被安排在下一个计时器滴答发生时运行,以便系统调用被中断。

但是我做了一个小测试,它失败了。我写了一个名为 sleep() 的用户模式进程。我在内核中将进程的状态更改为 TASK_RUNNING ,但 sleep() 根本没有被中断,进程仍在休眠。

然后我尝试了 wake_up_process(process) ,它失败了。

然后我尝试了 set_tsk_thread_flag(process,TIF_SIGPENDING),它失败了。

然后我尝试了 set_tsk_thread_flag(process,TIF_SIGPENDING) 和 wake_up_process(process),成功了!! sleep() 被中断,进程开始运行。

所以事情没那么简单。有谁知道系统调用究竟是如何被信号中断的?

最佳答案

查看 __send_signal来自 signal.c。它在接近尾声时调用 complete_signal,最终调用这个小函数:

void signal_wake_up_state(struct task_struct *t, unsigned int state)
{
set_tsk_thread_flag(t, TIF_SIGPENDING);
/*
* TASK_WAKEKILL also means wake it up in the stopped/traced/killable
* case. We don't check t->state here because there is a race with it
* executing another processor and just now entering stopped state.
* By using wake_up_state, we ensure the process will wake up and
* handle its death signal.
*/
if (!wake_up_state(t, state | TASK_INTERRUPTIBLE))
kick_process(t);
}

这就是您的做法。请注意,仅设置线程标志是不够的:您必须使用唤醒功能来确保进程被调度。

关于linux - 系统调用如何被信号中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18057745/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com