睡眠系统调用强制上下文切换? - C
Sleep system call force a context switch? - C
我正在努力提高我对调度和处理信号的理解,并且我正在尝试解决一个结果对我来说不是很清楚的问题。
考虑以下代码:
void sUsr()
{
printf("A1\n")
sleep(1)
printf("A2"\n)
}
int main(int argc, const char* argv[])
{
sturct sigaction sa;
sigfillset(&sa.sa_mask);
sa.sa_handler = &sUser
sigaction(SIGINT, &sa, NULL)
sigaction(SIGSTP, &sa, NULL)
kill(getpid(). SIGINT);
kill(getpid(), SIGSTP);
}
我正在尝试找出所有可能的打印选项。
我的“准则”:
- sigfillset 阻止所有在处理信号时到达的信号。
- 从内核切换到用户时,信号处理就位。
- kill 是系统调用。
我不明白为什么系统不能打印只“A1\nA2\n”
当第一个信号得到处理(由于第一个 kill 调用而从内核到用户的第一次转换)时,OS 调用 sUsr 并打印“A1”。然后,睡眠系统调用将控制权交还给调用第二个 kill 调用的主进程,但由于阻塞掩码而无法完成。睡眠时间过去了,我们回去处理系统调用,现在处理程序打印“A2”。
处理程序在用户 space 中运行,因此挂起的信号将不会被处理(没有从内核切换到用户)并且进程停止存在。
不幸的是我错了,我想了解我建议的解决方案在哪里失败。
编辑:给我的解决方案是这个程序的唯一打印选项是 "A1\nA2\nA1\n\A2\n"
SIGSTP
信号被阻塞,而 SIGINT
信号处理程序是 运行 但它并没有丢失。它变为待处理。因此,一旦 SIGINT
处理程序完成,将调用下一个信号处理程序来处理 SIGSTP
.
OT:请注意 printf
在技术上不是 async safe 函数,不应在信号处理程序中调用。
我正在努力提高我对调度和处理信号的理解,并且我正在尝试解决一个结果对我来说不是很清楚的问题。 考虑以下代码:
void sUsr()
{
printf("A1\n")
sleep(1)
printf("A2"\n)
}
int main(int argc, const char* argv[])
{
sturct sigaction sa;
sigfillset(&sa.sa_mask);
sa.sa_handler = &sUser
sigaction(SIGINT, &sa, NULL)
sigaction(SIGSTP, &sa, NULL)
kill(getpid(). SIGINT);
kill(getpid(), SIGSTP);
}
我正在尝试找出所有可能的打印选项。 我的“准则”:
- sigfillset 阻止所有在处理信号时到达的信号。
- 从内核切换到用户时,信号处理就位。
- kill 是系统调用。
我不明白为什么系统不能打印只“A1\nA2\n” 当第一个信号得到处理(由于第一个 kill 调用而从内核到用户的第一次转换)时,OS 调用 sUsr 并打印“A1”。然后,睡眠系统调用将控制权交还给调用第二个 kill 调用的主进程,但由于阻塞掩码而无法完成。睡眠时间过去了,我们回去处理系统调用,现在处理程序打印“A2”。
处理程序在用户 space 中运行,因此挂起的信号将不会被处理(没有从内核切换到用户)并且进程停止存在。 不幸的是我错了,我想了解我建议的解决方案在哪里失败。
编辑:给我的解决方案是这个程序的唯一打印选项是 "A1\nA2\nA1\n\A2\n"
SIGSTP
信号被阻塞,而 SIGINT
信号处理程序是 运行 但它并没有丢失。它变为待处理。因此,一旦 SIGINT
处理程序完成,将调用下一个信号处理程序来处理 SIGSTP
.
OT:请注意 printf
在技术上不是 async safe 函数,不应在信号处理程序中调用。