【问题标题】:Sleep system call force a context switch? - C睡眠系统调用强制上下文切换? - C
【发布时间】:2021-11-18 21:18:47
【问题描述】:

我正在努力提高我对调度和处理信号的理解,并且我正在尝试解决一个结果对我来说不是很清楚的问题。 考虑以下代码:

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 是一个系统调用。

不明白为什么系统不能打印only "A1\nA2\n" 当第一个信号得到处理时(由于第一次 kill 调用从内核到用户的第一次转换),操作系统调用 sUsr 并打印“A1”。然后, sleep sys 调用将控制权交还给调用第二个 kill 调用的主进程,但由于阻塞掩码而无法完成。睡眠时间过去了,我们回去处理系统调用,现在处理程序打印“A2”。

处理程序在用户空间中运行,因此未处理的信号将不会被处理(没有从内核切换到用户)并且进程停止存在。 不幸的是,我弄错了,我想了解我建议的解决方案在哪里失败。

编辑:给我的解决方案是这个程序的唯一打印选项是“A1\nA2\nA1\n\A2\n”

【问题讨论】:

    标签: c signals system-calls sleep scheduling


    【解决方案1】:

    SIGSTP 信号在 SIGINT 信号处理程序运行时被阻塞,但它没有丢失。它变为待处理。因此,一旦SIGINT 处理程序完成,将调用下一个信号处理程序来处理SIGSTP

    OT:请注意,printf 在技术上不是async safe 函数,不应在信号处理程序中调用。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2020-11-01
      • 2023-03-04
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      相关资源
      最近更新 更多