在for循环中fork

tom*_*h13 4 unix fork

我对下面的代码及其行为有疑问:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define N 5
#define nt 1

int pm[N][2],pid[N];
int i,j,size;
char s[100];
int count=0;

int main()
{
 for(i=1;i<N;i++)
    {
      printf("\n i=%d",i);

      if(pid[i]=fork() == -1)
        {
          printf("\n fork not wrking");
          exit(1);
        }
      else if(pid[i]>0)
        {
          printf(" \n pid:%3d\n",pid[i]);
        break;
        }

    }
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我最初认为代码会产生一个进程并跳出循环.因此,
1产生2并跳出.
2次产卵3次,跳出
3次产卵4次,跳过
4次产卵5次并跳过.

我尝试执行此代码并对我得到的答案感到惊讶(对于代码中的i的printf).这是输出

 i=1
 i=2
 i=3
 i=2
 i=4
 i=3
 i=3
 i=3
 i=4
 i=4
 i=4
 i=4
 i=4
 i=4
 i=4
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释这里发生了什么.注意:我正在使用Solaris计算机.

Joh*_*ica 7

更新

您在更新的代码中缺少一组括号.那应该if ((pid[i] = fork()) == -1)不是if (pid[i] = fork() == -1)!

后者等同if (pid[i] = (fork() == -1))于优先规则.它最终pid[i]通过循环每次分配0 ,因此父母认为它们是子进程并且不会突破循环.


我同意你对应该发生的事情的分析.父母应该生成一个孩子然后退出,所以每个i=n打印输出应该只显示一次.

您确定要按照问题中指定的方式输入吗?我运行你的程序(稍加修改)并得到你预测的输出:

$ cat fork.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define N 5

int main() {
    int pid[N], i;

    for(i=1;i<N;i++) /* What’s the total number of processes? */
    {
    printf("i=%d\n",i); // Output of all the is
    if((pid[i]=fork())==-1) exit(1);
    else if(pid[i] > 0) break;
    }

    return 0;
}
$ gcc -o fork fork.c
$ ./fork
i=1
i=2
$ i=3
i=4
Run Code Online (Sandbox Code Playgroud)

请注意,我将\n打印输出移到了最后.当你把它放在行的开头时,你最终stdout没有被刷新,所以当父和子进程都刷新它们的输出缓冲区时你得到多个打印输出.这可能是导致问题的原因.在我的Mac上FWIW我每次打印输出两次.