2017-11-27 6 views
1

ユーザに整数を尋ねて変数nに格納するCプログラムを書いてみたい。次に、メインプロセスは2つの子プロセス(両方ともメインプロセスの子でなければならない)を作成します。 1人の子供は、n> 10の場合には正常に終了し、それ以外の場合には の場合は正常終了します。一方、n> 20の場合は正常終了します。メインプロセスでは、子プロセスの数が正常に終了した を出力する必要があります。どのように正常に終了する子プロセスを数えますか?

これはこれまで私が行ってきたことです。

#include <stdio.h> 

void main (void) 
{ 

int n; 

printf("Give me a number: "); 

scanf("%d", &n); 

pid_t child_a、child_b;

child_a = fork(); 

if (child_a == 0) { 


     if (n>10) { 
       exit(1) 
     }else{ 
       exit(0) 
     } 
} else { 


child_b = fork(); 

if (child_b == 0) { 
     if (n>20){ 
       exit(1) 
     }else{ 
       exit(0) 
} 
    } else { 
     /* Parent Code */ 
    } 
} 





} 

しかし、どのように多くの子プロセスが正常終了するのですか?

+0

[* signals *](https://lasr.cs.ucla.edu/vahab/resources/signals.html)のチュートリアルを読んだり、それらの組み合わせをお勧めします。シグナルを一般的に扱い、そのコンセプトを理解することができるときは、 'SIGCHLD'シグナルを検索し、それについて読むことができます。そうすれば、 'fork'コールの数が確定的でない場合に存在する子の数を数えることができます。しかし、あなたの場合は*です*。 * 2つの*子プロセスを開始すると、それだけです。つまり、各子プロセスを終了させるために['wait'](http://man7.org/linux/man-pages/man2/wait.2.html)でき、その呼び出しによって終了ステータスを得ることができます。 –

+0

' printf() 'ステートメントは悲惨な結果になります。それはコンパイルされません。あなたが念頭に置いていることを伝えるのは難しいです。子供の死体をループして収集することができます。たとえば、次のようになります。 'int count = 0; int corpse; intステータス。 while((corpse = wait(&status))> 0){printf( "PID%dステータス0x%.4X \ n"、死体、ステータス); if(status == 0)count ++; } ' - など詳細情報を表示します。それはあなたが理解するのを助けます(あなたがそれを分かりやすくするならば)。 –

+0

貼り付けが間違っていたら今修正する必要があります。 – koll

答えて

1

wait()コマンドを使用する必要があります。システムコールwait()は、子プロセスの1つが終了するか、シグナルが受信されるまで、呼び出しプロセスをブロックします。

int status; 
pid_t pid = wait(&status); 
printf("Exit = %d, child = %d\n", WEXITSTATUS(status), pid); 

はで例を参照してください。(待機を使用して

fork() and wait() with two child processes

及び第二例)とWEXITSTATUS()も

Linux fork() and wait()

の複数のコアスケジューリングで起こるかについての詳細プロセス:

fork() and wait() calls

+0

'WEXITSTATUS'は、' WEXITED'がtrueと評価された場合にのみ使用されることに注意してください。こちらのドキュメントをご覧ください:https://man7.org/linux/man-pages/man2/waitpid.2.html – alk

関連する問題