c - C 叉练习

标签 c fork

我试图了解 fork() 方法在 C 中的工作原理。这是我教科书中的一个示例问题:

int
main(void)
{
  pid_t process_id;
  int status;

  if (fork() == 0) { 
    if (fork() == 0) { 
      printf("A"); 
    } else {
      process_id = wait(&status);
      printf("B");
    }
  } else {
    if (fork() == 0) { 
      printf("C");
      exit(0);
    }
    printf("D");
  }
  printf("0");
  return (0);
}

Which of the following outputs are possible?

1) D0A0B0C

2) CDAB000

3) DA00CB0

4) D0AB0CD

5) AD00BC0

我在纸上勾画了出来,我认为正确的答案是:1、3、5。不过,我在处理 wait(&status) 时遇到了一些困难。我的回答对吗?

最佳答案

我刚刚计算出来,我认为 1、3 和 5 是正确的。

有4个进程,但是其中2个因为等待而产生了依赖关系。 这意味着可能的输出是(_表示可能抢占):

_A_0_B_0_
_C_
_D_0_

2 和 4 不起作用,因为 A 和 B 之间没有 0。 wait 在 fork()!=0 的进程中调用,这意味着它是父进程。 fork() 的语义是向父进程提供子进程的进程 id 作为返回值,而子进程则获得返回值 0。 如果您按照上面的 3 个输出进行操作,应该很容易看出 1、3 和 5 是有效的。

关于c - C 叉练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36927637/

相关文章:

c++ - 如何通过 Windows 编译 SWIG

c - 原子操作-C

c - 了解 Unix 中的 `read, write` 系统调用

c - 在C中使用printf()和fork()复制输出

c++ - 线程和 fork()。我该如何处理?

c - 借助宏或 typedef : (x) ((x) - 1) 的 C 语言有效表达式

c - 如何复制字符串并向新字符串添加更多单词?

c - 父子进程之间发送接收Char *

c++ - 重定向标准输出时调用 dup2 失败

c - 如何不断地从父进程向子进程发送信号?