c - C 中的 fork 和信号

标签 c signals fork flags

有人可以帮助我逐步完成以下 C 代码以了解输出应该是什么。

int x = 0;
pid_t pid;
int flag=1;

void handler1(int sig) {
    x=x+1;
    printf("%d\n",x);
    fflush(stdout);
    exit(0);
}

void handler2(int sig) {
    x = x + 2;
    flag = 0;
    waitpid(-1,NULL, 0);
}

int main() {
    signal(SIGUSR1, handler1);
    signal(SIGCHLD, handler2);
    printf("%d\n",x);
    fflush(stdout);
    if ((pid = fork()) == 0) {
        while(1) {};
    }
    kill(pid, SIGUSR1);
    while(flag) {};
    printf("%d\n",x);
    fflush(stdout);
    exit(0);
}

我认为输出应该是“213”,但我不确定。

最佳答案

从技术上讲,它是未定义的,因为您使用信号处理程序中的stdio函数。我将用单个 write 替换 printf/fflush 组合(但实际刷新流的奖励点)。从信号处理程序退出也被认为是不好的形式。

Also, both x and flag need to be made volatile .

  1. 首先发生的事情是打印 x,但它的值仍然是 0
  2. 然后,该进程被fork()ed。
  3. SIGUSR1 被传递给子级,并在其中调用处理程序。处理程序在子进程内递增 x,并打印 1
  4. 子进程退出,并调用父进程的 SIGCHLD 处理程序,将父进程的 x 副本(仍为 0)增加 2。
  5. 父级退出循环轮询 flag,并打印当前值 2

所以输出应该是012

关于c - C 中的 fork 和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533424/

相关文章:

c - 如何在netfilter返回NF_DROP后停止后续数据包?

C - 多个子级 - 信号相互覆盖

c++ - Qt 信号和槽通过引用传递

C 如何在进程之间共享信息?

c - 如何在 c 中解决这个 fork() 示例,

c - 用指针打印最大值

c - gcc 的奇怪编译问题

将 C 字符串逐个字符复制到动态 char*

c - 如何显示 sigusr1 和 sigusr2 的输出?

在 C 中关闭管道、dup2、文件描述符?