for()循环中的fork()

我正在尝试做一个家庭作业,我必须使用fork()但我不知道为什么在通过我的for循环运行它们之后我无法阻止我的for:

 #include  #include  #include  #include  #include  int main(int argc, char *argv[]){ int limit = argc/2; if(argc%2 == 0){ perror("the number of arguments given must pe even!"); exit(1); } int i; for(i=0; i<=limit; i++){ if(fork()==-1){ perror("childes couldn't be created\n"); exit(1); } if(fork()==0){ printf("fork: %d \n",i); exit(1); } wait(0); } printf("exiting...\n"); return 0; } 

输出:

 warzaru@ubuntu:~/OS/UprocH$ ./exe abcd fork: 0 fork: 0 fork: 1 fork: 1 fork: 1 fork: 2 fork: 2 fork: 1 fork: 2 exiting... exiting... fork: 2 exiting... exiting... fork: 2 exiting... exiting... exiting... warzaru@ubuntu:~/OS/UprocH$ fork: 2 fork: 2 fork: 2 exiting... 

Daniel Fischer强迫我提供答案。

更改:

 if(fork()==-1){} // first fork if(fork()==0){} // second fork 

至:

 pid = fork(); if(pid == -1) { ... //failed } else if(pid == 0) { ... //success } 

或者使用switch语句:

 switch(fork()) { case -1: ... // failed break; case 0: ... // success break; } 

您可以使用execl()或exec的其他变体,这可以确保正在创建的子级不会从父级inheritance任何内容。 这将允许您创建具有for循环的子项而不会进入指数子爆炸。 适当地修改execl函数的参数,你可以创建3个进程,如:

 main() { int i,pid[3]; for(i=0;i<3;i++) { pid[i]=fork(); if (pid[i]==0) execl("path",0,0); } sleep(2); }