2016-05-01 9 views
0

10個の子プロセスを持つ1000個の数値の配列の中で最大の値を見つけなければなりません(したがって、すべてが100個の値しかチェックしないようにする必要があります)。 私はすでにすべてのことをやっていますが、私は値を読むことに固執しています。フォークされた10個の子プロセス、親プロセスはどのように戻り値を収集できますか?

は、ここでは、コードです:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int main(){ 
    int array[1000]; 
    int i, j; 
    int pids[10]; 
    int searchminindex; 
    int searchmaxindex; 
    int maxindex; 

    srand(time(NULL)); 

    //fill up array with random numbers 
    for(i = 0; i < 1000; i++) 
    { 
      tomb[i] = random() % 5000; 
    } 

    //create 10 child processes 
    for (i = 0; i < 10; i++) { 
      if ((pids[i] = fork()) < 0) { 
        perror("fork"); 
        abort(); 
      } 
      else if (pids[i] == 0) { 
        searchminindex = i * 100; 
        searchmaxindex = (i+1) * 100; 

        //finding the biggest value 
        maxindex = searchminindex; 
        for(j = searchminindex+1; j < maxindex; j++) { 
          if(array[maxindex] < array[j]) 
            maxindex = j; 
        } 
      } 

    } 
    for(i = 0; i < 10; i++){ 
     //here's where I'd read the return values of the subarrays 
    } 

    return 0; 
} 

私はパイプを使用してもWEXITSTATUSを使用してみましたが、私は本当に困惑していると、そのようなパイプや物事の一端を閉鎖する場所がわかりません、 WEXITSTATUSと私は完全に失われています。

お手伝いができますか?

+0

複数の見出しが良いオプションになります –

+2

これに対してスレッドを使用していませんか?物事は少し楽になります。 –

+0

グローバル配列pidsresults [10]を追加して、各pidsにその結果を独自のインデックスに配置できますか? – zipzit

答えて

0

forkから返されたpidをテストし、メインプロセスが子プロセスのように振る舞わないようにコードを分岐させ、子プロセスが子プロセスを子プロセスで生成しないようにする必要があります。それはフォークプロセス間のメモリを共有

...の世話をしていたら、私はあなたがそれを置くことですプロセスごとに指定する必要があります、プロセス間共有メモリを作成するためにmmapを使用するだけでなくhere

を説明されていますすべての子がいつ終了したかを判断するにはwaitを使用し、良いプログラムは終了ステータスを評価し、異常終了した子があるかどうかをユーザーに通知します。

親が終了する前に共有メモリをクリーンアップすることを忘れないでください。

+0

犯罪はありませんが、SHMを設定すると、0と100の間の10倍の値が返されますが、少しでも静かに見えます... ;-) – alk

+0

合意。マルチスレッドの代わりにフォークを使用することも過剰ですが、これは学問的な演習であり、プロダクションコードの最適化の問題ではありません。 – Jfevold

0

あなたはforkから返されたpidをテストし、メインプロセスが子プロセスのように振る舞わないようにコードを分岐させる必要があり、子プロセスが子プロセスを子プロセスとして起動させないようにする必要があります。一度それが世話をしたら...

mmapの代わりに、または共有メモリをまったく設定することは、WEXITSTATUSを使うことです。マニュアルページによると、最下位8ビットしか返さないため、戻り値が127より大きい場合、これはあなたの最良の選択肢ではない可能性があります。最大255まで動作させることができますが、charの符号性には注意してください。標準ではありません。

int returned_values[10]; 
for(int i = 0; i < 10; ++i) 
{ 
    int status; 
    wait(&status); 
    if(WIFEXITED(status)) 
     returned_values[i] = WEXITSTATUS(status); 
    else { 
     //Do something more meaningful here 
     //This means a child received a signal, or any of the other ways wait returns other than a child exiting. 
     --i; 
    } 
+0

それはうまくいっていますが、残念ながら戻り値は127、または255以上になる可能性があります。 – Preno

+0

@Preno次に私の他の答えを考えてください。 – Jfevold

関連する問題