睡眠系统调用强制上下文切换? - 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);
}

我正在尝试找出所有可能的打印选项。 我的“准则”:

  1. sigfillset 阻止所有在处理信号时到达的信号。
  2. 从内核切换到用户时,信号处理就位。
  3. 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 函数,不应在信号处理程序中调用。