私は親プロセスと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" を追加し、すべてはこの行のために
(https://でのstackoverflow。com/questions/19825489/forking-and-piping-processes-in-c)を参照してください。もちろん、あなたの現在のコードは異なります。 –
'if(id == 0){ printf("親番号:%d \ n "、num); (パイプ[i] [0]); '、' i'の値は 'CHILDS + 1'なので、' pipes'配列の範囲外にアクセスし、 'close()'は閉じていませんあなたがそれを閉じようとしていたもの。私は 'i'が' 0'であるべきだと思っています。 –