【发布时间】: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);
}
我正在尝试找出所有可能的打印选项。 我的“指导方针”:
- sigfillset 会阻止所有在处理信号时到达的信号。
- 从内核切换到用户时会进行信号处理。
- kill 是一个系统调用。
不明白为什么系统不能打印only "A1\nA2\n" 当第一个信号得到处理时(由于第一次 kill 调用从内核到用户的第一次转换),操作系统调用 sUsr 并打印“A1”。然后, sleep sys 调用将控制权交还给调用第二个 kill 调用的主进程,但由于阻塞掩码而无法完成。睡眠时间过去了,我们回去处理系统调用,现在处理程序打印“A2”。
处理程序在用户空间中运行,因此未处理的信号将不会被处理(没有从内核切换到用户)并且进程停止存在。 不幸的是,我弄错了,我想了解我建议的解决方案在哪里失败。
编辑:给我的解决方案是这个程序的唯一打印选项是“A1\nA2\nA1\n\A2\n”
【问题讨论】:
标签: c signals system-calls sleep scheduling