【问题标题】:System Programming - Fork() Method系统编程 - Fork() 方法
【发布时间】:2012-04-27 06:26:34
【问题描述】:

我正在研究系统编程系统调用。我的作业中有一个代码块(如下所示)。这个问题问我要打印多少个 A、B 或 C。我的问题是if(pid == 0) 是什么意思?我猜if(pid == 0) 的意思是假的,所以我分析会打印 2 x A 和 2 x B。我写还是?第二个问题是pid2 = fork() 是否再次执行main?

int main()
{
  int pid,pid2;
  int i;
  pid = fork();
  printf("A\n");
  if (pid == 0)
    pid2=fork();
  if (pid2)
    printf("B\n");
  printf("C\n");
  return 0;
}

【问题讨论】:

  • pid == 0 表示当前进程是子进程。
  • @Aslan986 - 你不是说孩子吗?
  • 因为 pid2 最初有一个不确定的值,并且从未在原始父级中设置。原始父母可能会或可能不会打印“B”。假设你得到了ABCABCC,尽管顺序可能会有所不同,具体取决于哪些进程获得处理器时间。
  • 如果你在负载很重的系统上运行它,它可能只会打印AC!

标签: c++ c unix operating-system fork


【解决方案1】:

pid2 未在父进程案例中初始化。将打印多少 B 是未定义的行为。

pid=fork() 不会再次执行 main(),希望 ...

【讨论】:

  • 关于pid2未初始化的说明很重要!
【解决方案2】:

Fork 调用的返回值会根据您当前所处的进程返回不同的值。

假设您希望在父进程中执行某些代码,您可以将这部分代码放入此条件块中:

p = fork();
if (p > 0)
{
    // We're the parent process
}

如果你想在子进程中执行一些代码,同样适用:

p = fork();
if (0 == p)
{
    // We're the child process
}

其余的(由父进程和子进程执行)在 else 块中。

【讨论】:

    【解决方案3】:

    分叉返回 2 个值:

    • 子进程中为0,父进程中为正值。
    • 在 fork() 调用之后,您将有 2 个进程(如果没有发生错误,则返回 -1)。

    在您的示例中,您创建了 3 个进程并将输出 2A、1B 和 3C

    【讨论】:

      【解决方案4】:

      fork 系统调用很特殊。您调用它一次,它会返回两次。一次在孩子身上,一次在父母身上。

      在父进程中返回子进程的 pid,在子进程中返回 0。因此,if (pid == 0) 表示“如果这是子进程”。

      【讨论】:

        【解决方案5】:

        fork0返回给子进程,将子进程的pid返回给父进程。手册页应该清除所有其他内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-13
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 2016-01-01
          • 2011-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多