2012-04-15 25 views
8

私はいくつかの最終結果を得るために複数のI/Oパイプ(プロセスごとに1つのパイプ)を使用するmapreduceプログラムを作成しています。プロセスの作成に問題があります。具体的には、私は次のエラーを取得しています:fork() - 複数のプロセスとシステムコール

wait error: Interrupted system call 

これは、プロセスを生成私のコードです:

while (values[inc]!=NULL) //provided array of text lines 
{ 
    if ((pid = fork()) == -1) { 
     perror("fork error"); 
     exit(EXIT_FAILURE); 
    }  

    else if (pid == 0) {    /* start of child process  */ 
     printf("Child process...\n"); 
     /* pipes[inc][1] is a file descriptor to which myMap writes some data 
      using the write() system call 
      mr is a struct that holds other function pointers */ 
     mr->myMap(pipes[inc][1],values[inc]); 
     exit(0); 
    } 
    else {       /* start of parent process  */ 
     printf("Parent process...\n"); 

     if ((wpid = wait(&status)) == -1) 
     /* Wait for child process.  */ 
      perror("wait error"); 
     else {      /* Check status.    */ 
      if (WIFSIGNALED(status) != 0) 
       printf("Child process ended because of signal %d\n", 
         WTERMSIG(status)); 
      else if (WIFEXITED(status) != 0) 
       printf("Child process ended normally; status = %d\n", 
         WEXITSTATUS(status)); 
      else 
       printf("Child process did not end normally\n"); 
     } 
     //close(fd[1]); 

     printf("Parent process ended\n"); 
    } 
    inc++; 
} 

この後、私は一つのスレッド

pthread_t newThread; 
pthread_create(&newThread,NULL,threadFunction,values); 
pthread_join(newThread,NULL); 

を作成していthreadFunctionは(選択し使用しています)関数を使用して、どのファイル記述子が読み込み準備ができているかを調べ、それを読み込んで辞書に格納します。

フォームgdbデバッガ、プログラムの出力を実行する場合:

Parent process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 
Parent process... 
Child process ended normally; status = 0 
Parent process ended 
Parent process... 
Child process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 

私は問題を解決する方法がわかりません。助言がありますか?

ありがとうございます!

答えて

9

wait()呼び出しをループに入れ、エラー(-1)を返し、errno == EINTRループを続ける必要があります。その他のエラーは実際のエラーであり、そのように扱う必要があります。タイマーをプロファイリングなどの

物事は信号がプロセスに送信されることがあります、しかし、おそらく中断の原因となる信号は、あなたが知っているように、子プロセスは状態を変更したときに呼び出されSIGCHLD、です。

EDIT:OK、私はコードで答えを書きます:

do 
{ 
    wpid = wait(&status); 
} 
while (wpid == -1 && errno == EINTR); 
if (wpid == -1) 
{ 
    perror("wait error"); 
    return -1; 
} 
else 
{ 
    // we have wait status 
    ... 
} 
+0

私はあなたが何を意味するかわかりません。詳しく教えてください。 – Krzysiek

+1

@Rafcio私は自分の答えを更新しました。 – trojanfoe

+1

ありがとうございます。それは理にかなっている! :) – Krzysiek

関連する問題