我对下面的代码及其行为有疑问:
#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计算机.
您在更新的代码中缺少一组括号.那应该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我每次打印输出两次.