首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解waitpid如何处理信号

了解waitpid如何处理信号
EN

Stack Overflow用户
提问于 2020-07-26 05:51:17
回答 1查看 36关注 0票数 1

考虑下面的伪C代码:

代码语言:javascript
运行
复制
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, &param);
    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的一次考试。问题如下:

代码语言:javascript
运行
复制
In multi cores CPU what would be printed?

答案是我们不知道,因为它可能是A,然后是B,或者是B,然后是A。我不明白为什么。如果父母正在等待具有waitpid的儿子,而儿子发送信号SIG_ALRM来为父母调用alrm_handler函数,那么父母将完成函数的执行,然后返回等待儿子,直到他完成运行,不是吗?所以它应该是A,然后是B

EN

Stack Overflow用户

发布于 2020-07-26 19:33:03

根据POSIX的说法,在调用由signal设置的信号处理程序之后,是否重新启动系统调用是未定义的。

  • System V和Linux signal系统调用不会重新启动系统调用。
  • BSD和默认情况下的GLibc会重新启动系统调用。

如果使用System V signal,则waitpid可以在信号发送后立即返回,从而允许以任何顺序打印字母。如果标准输出是管道或常规文件,则仅输出B,因为子级处于无限循环中

使用BSD signal时,由于子级中的无限循环,waitpid不会返回,因此只会打印A。如果标准输出是管道或常规文件,则不会输出任何内容。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63093915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档