【发布时间】:2020-11-15 12:29:34
【问题描述】:
考虑以下伪 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;
}
它来自操作系统的考试。问题如下:
In multi cores CPU what would be printed?
答案是我们无法知道,因为它可能是A,然后是B 或B,然后是A。我不明白为什么。如果父级正在用waitpid 等待子级,而子级发送信号SIG_ALRM 为父级调用alrm_handler 函数,则父级将完成函数的执行,然后返回等待子,直到他完成运行,不?所以应该是A,然后是B。
【问题讨论】:
-
“儿子”正在无限循环。所以它将是 A 后面没有任何内容,因为“儿子”进程永远运行。
-
这是我的想法,但答案是我们不知道。我唯一的猜测是
waitpid不会等他儿子完成 -
为什么 waitpid 不等待?还要注意
waitpid(而不是wait)有一个选项不等待(你的伪代码在这里没有帮助)。 -
是的,我同意。我只是想弄清楚问题的作者是什么意思。据我了解,
waitpid将等待它获得一些价值。
标签: process signals fork system-calls