2012-05-03 37 views
6

私はfork()を使用しなければならない宿題を作ろうとしていますが、なぜforループでそれらを実行した後にフォークを停止できないのか分かりません:for()ループ内のfork()

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

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; 
} 

出力:

[email protected]:~/OS/UprocH$ ./exe a b c d 
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... 
[email protected]:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting... 
+4

同じループで2回フォークしていますか? –

+0

いいえ、どうしたの? :< –

+4

あなたはフォークボムを作成しました。次のようなことを行うべきです:pid = fork(); if(pid <0)...; (fork()== 0) '< - 第2のフォーク。if(pid == 0).... – kofemann

答えて

15

ダニエル・フィッシャーは答えを提供するために、私を余儀なくされました。

変更:

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; 
} 
+2

ありがとう! D –

+4

"強制"はかなり強い言葉です;) –

0

あなたは、これは確実に、EXECL()またはexecのいくつかの他のバリアントを使用することができます作成された子は親から何も継承しないということです。これにより、指数関数的な子の爆発にならずに、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); 
}