2016-03-31 1 views
0

私は親プロセスと5つの子プロセスを持っています。親は子1、子1は子2、...、子5は親と通信したい。パイプを通して最後の子から親に番号を送信するにはどうすればいいですか?

私は、子プロセスから親プロセスへの最後の接続以外のすべての子プロセスと通信できます。

ここに私のコードでは、お子様のため5に、親のための0と1を返す)私は(フォークを使うところbabyMakerがある

int main(void){ 
pid_t child[CHILDS+1]; 
int aux = 0, id, i, num, pipes[CHILDS][2]; 

for(i = 0; i < CHILDS +1; i++){ 

    if((pipe(pipes[i])) == -1){ 
     perror("Pipe failed"); 
     return 1; 
    } 
} 

id = babyMaker(child); 

srand((unsigned) getpid()); 
num = rand() % 50 + 1; 

if(id == 0){ 
    printf("Parent number: %d\n", num); 
    close(pipes[i][0]); 
    close(pipes[CHILDS][1]); 

    for(i = 0; i < CHILDS; i++){ 
     if(i != id){ 
      close(pipes[i][0]); 
      close(pipes[i][1]); 
     } 
    } 

    write((pipes[0][1]), &num, sizeof(int)); 
    close(pipes[0][1]); 


    read(pipes[CHILDS][0], &aux, sizeof(int)); 

    while(wait(NULL) > 0); 

    close(pipes[CHILDS][0]); 

    if(aux > num){ 
     num = aux; 
    } 

    printf("Greatest number: %d\n", num); 

}else{ 
    close(pipes[id-1][1]); 
    close(pipes[id][0]); 

    for(i = 0; i < CHILDS; i++){ 
     if(i != id && i != id-1){ 
      close(pipes[i][0]); 
      close(pipes[i][1]); 
     } 
    } 

    printf("Child %d with number: %d\n",id, num); 

    read((pipes[id-1][0]), &aux, sizeof(int)); 
    close(pipes[id-1][0]); 

    if(num < aux){ 
     num = aux; 
    } 

    write((pipes[id][1]), &num, sizeof(int)); 
    close(pipes[id][1]); 

    printf("\nChild %d received the number: %d\n", id, aux); 
    exit(id); 
} 

return 0; 
} 

です。

CHILDSはヘッダーに定義された変数です。

子供の番号が受け取った番号よりも大きいかどうかを確認し、そうであれば送信します。そのプロセスの元の番号を送信しない場合。親が最も多くを印刷します。

私は理解しようとしていますが、私が紛失しているものは見つかりませんでした。より多くの情報が必要な場合は、私に知らせてください。

編集1:ここでは、babyMakerとヘッダファイルのコードを実行することが関係している可能性があります。

babyMaker

int babyMaker(pid_t *child){ 
int i; 

for(i = 0; i < CHILDS; i++){ 
     if((child[i] = fork()) == 0){ 
      return i+1; 
     } 
    } 
return 0; 
} 

ヘッドファイル

#ifndef HEAD_H 

#define HEAD_H 

#include <stdio.h> 
#include <stdlib.h> 
#define CHILDS 5 

#endif 

メイン上の#include "head.h" を追加し、すべてはこの行のために

+0

(https://でのstackoverflow。com/questions/19825489/forking-and-piping-processes-in-c)を参照してください。もちろん、あなたの現在のコードは異なります。 –

+0

'if(id == 0){ printf("親番号:%d \ n "、num); (パイプ[i] [0]); '、' i'の値は 'CHILDS + 1'なので、' pipes'配列の範囲外にアクセスし、 'close()'は閉じていませんあなたがそれを閉じようとしていたもの。私は 'i'が' 0'であるべきだと思っています。 –

答えて

1

を動作するはずです:

id = babyMaker(child); 

idはvaを持つ予定です

close(pipes[id][0]); 

それがパイプのように定義されたため、無効である

close(pipes[5][0]); 

[5] [2]になることができる:この行手段1~5

のLUE。これはオフバイエイトエラーです。

はまた、これらの行は同じ理由で無効です。

int aux = 0, id, i, num, pipes[CHILDS][2]; 

close(pipes[CHILDS][1]); 
read(pipes[CHILDS][0], &aux, sizeof(int)); 
close(pipes[CHILDS][0]); 

おそらくあなたは、この行を意味しましたこのことにする

:あなたはあなたのプログラムで解決しようとしているあなたの問題は、本質的に[Cでフォークや配管のプロセス]の場合と同じである

int aux = 0, id, i, num, pipes[CHILDS+1][2]; 
+0

答えをありがとう!最後の行で私の質問に答えたが、なぜ他の部分が間違っているのか分からない。 IDは0から5の間の値を持ちます。親プロセスの場合、0を返します。また、正しいprocesseが接続していることを確認する必要があります。コードはパイプ[CHILDS + 1] [2]なぜ私は他の行が正しいのか理解できませんでした。 – AimForNuts

+0

配列が "int pipes [5]"と定義されている場合、パイプ[0]、パイプ[1]、パイプ[2]、パイプ[3]、パイプ[4]のみが有効です。あなたはパイプ[5]にもアクセスしようとしていました。 – contrapants

+0

「pid_t child [CHILDS + 1];」が必要な理由は同じです。 "pid_t child [CHILDS];で​​はなく" – contrapants

関連する問題