考虑下面的伪C代码:
static int G = 0;
void alrm_handler(int signo) {
G = 1;
}
void son() {
struct sched_param param;
param.sched_priority = 50;
sched_setscheduler(getpid(),SCHED_FIFO, ¶m);
kill(getppid(), SIG_ALRM);
sched_yield();
printf("A\n");
while(1);
exit(0);
}
int main() {
signal(SIG_ALRM, alrm_handler);
int son_pid = fork();
if(son_pid==0)
son();
waitpid(son_pid);
printf("B\n");
return 0;
}它来自于OS的一次考试。问题如下:
In multi cores CPU what would be printed?答案是我们不知道,因为它可能是A,然后是B,或者是B,然后是A。我不明白为什么。如果父母正在等待具有waitpid的儿子,而儿子发送信号SIG_ALRM来为父母调用alrm_handler函数,那么父母将完成函数的执行,然后返回等待儿子,直到他完成运行,不是吗?所以它应该是A,然后是B。
发布于 2020-07-26 19:33:03
根据POSIX的说法,在调用由signal设置的信号处理程序之后,是否重新启动系统调用是未定义的。
signal系统调用不会重新启动系统调用。如果使用System V signal,则waitpid可以在信号发送后立即返回,从而允许以任何顺序打印字母。如果标准输出是管道或常规文件,则仅输出B,因为子级处于无限循环中
使用BSD signal时,由于子级中的无限循环,waitpid不会返回,因此只会打印A。如果标准输出是管道或常规文件,则不会输出任何内容。
https://stackoverflow.com/questions/63093915
复制相似问题