2011-11-08 17 views
0

プログラムがwhileループを通してユーザー入力を継続的に受け取り、シェルスクリプトを実行しているときに各ループで現在のプログラムプロセスの新しい子をフォークするプログラムを作成しようとしています。これは私が現在持っているものです:Waitpidの使い方とBashスクリプティング

int main(int argc, char **argv) 
{ 
    while(!feof(stdin)){ 
     printf("Port Number:"); 
     fgets(portno, 100, stdin); 
     input[strlen(portno) - 1] = '\0'; 
     pid_t pid = fork(); 

     if (pid < 0){ 
      die("fork did not work"); 
     } else if (pid == 0){ 
      fprintf(stderr, "[pid=%d] ", (int)getpid()); 
      fprintf(stderr, "process started on port %s\n", portno); 
      execl("./netcattest.sh", "netcattest.sh", portno, (char *)0); 
      die("program failed"); 
     } else { 
      /* 
      if (waitpid(.... NEED HELP ON THIS PART 
      */ 
      fprintf(stderr, "[pid=%d] ", (int)pid); 
      fprintf(stderr, "program terminated\n"); 
     } 
    } 

return 0; 
} 

私の問題は、waitpidのドキュメントを読んでいる、私は少し機能を使用する方法については不明です。私がしたいのは、プログラムが親プロセスであり、現在終了しているすべてのプロセスを何とか識別できるようにしたいということです。

たとえば、ループを3回実行し、2番目のループの後のどこかで最初のプロセスが終了すると、何とか終了したプロセスのPIDを特定できるようにしたいと考えています。

私はそれがWNOHANGオプションを使用することを知っていますが、実際にはどのように動作するのかは本当に混乱しています。

大変ありがとうございます。

EDIT:また、各行を個別に区切るのではなく、コードの4つのインデントを素早く行う方法はありますか?

+1

はい、コードを選択し、 '{}'アイコンをクリックしてください。 –

+0

マイケルありがとう! – KWJ2104

答えて

0

私は、この機能を使用したことがありませんが、ドキュメントの私の理解では、次の操作を行うべきであるということです。

int status; 
pid_t pid = waitpid(-1, &status, WNOHANG); 

この時点で、pidはなり-1エラー、0のために何のプロセスが持っていない場合終了したプロセスのPID(任意に選択し、すべてのプロセスを待って、ただそれを呼び出したままにしておく)。マニュアルページで指定されたさまざまなマクロ関数を使ってstatusを調べると、プロセスがどのように終了したか、終了コードが何であるかを判断できます。

+0

それを得るための方法はありますか?それで、私は任意に選択したものの対して終了したすべてのプロセスを引き出すことができますか?ご回答有難うございます。 – KWJ2104

+0

私は自分の答えを編集しました - waitpidは0を返すまで呼び出し続けます.Windpidは単一のPIDとステータスのみを返すので、複数のプロセスを収集すると情報が失われます。 – Max

関連する問題