(とりわけ) 2 セットのファイル記述子を含む構造体があります。
int (*pfdsParent)[2], (*pfdsChild)[2]
構造体の他の配列を malloc すると、メモリが割り当てられます。
s -> pfdsParent = malloc(3 * x * sizeof(int))
s -> pfdsChild = malloc(3 * x * sizeof(int))
構造体には、ファイル内の各行からの情報が含まれています。この情報は、ファイル内の各行のプロセスを作成するために使用されます。子プロセスはプログラムを実行し、パイプは双方向である必要があります (または、それぞれに 2 つのパイプが必要です)。私の最初の質問は、これらのファイル記述子の値を「割り当てる」ことについてです。私が見た例では、次のようなことをするだけです。
int pfds[2];
pipe(pfds);
したがって、これらの記述子を初期化する必要はないと思いました。しかし、アクセスしようとしてループしている場合は、
(s -> pfdsChild[i][0])
私が作成しているi番目のプロセスの子のstdinについて話していることを知っていますか? これらの行にエラー/警告は表示されませんが、インデックスを作成したことがない場合、どのように機能するのか混乱します。2つ目の質問は、親子のコミュニケーションについてです。パイプに関する私の (限られた) 理解は、私を関数に導きました。
int pipeFork(struct *s, int* Length){
int i, status;
for(i = 0; i < *Length; i++){
char *args[] = {(s-> Name[i]), (s-> Args[i]), NULL};
pipe(s-> pfdsParent[i]);
pipe(s-> pfdsChild[i]);
if(!fork()){ // child
// parent stdout goes to child stdin (read from child)
dup2((s-> pfdsChild[i][0]), (s-> pfdsParent[i][1]));
close((s-> pfdsParent[i][0]));
close((s-> pfdsChild[i][1]));
// child stdout goes to parents stdin (read from parent)
dup2((s-> pfdsParent[i][0]), (s-> pfdsChild[i][1]));
close((s-> pfdsParent[i][1]));
close((s-> pfdsChild[i][0]));
execvp((s-> Name[i]), args);
} else{ // parent
dup2((s-> pfdsChild[i][0]), (s-> pfdsParent[i][1]));
close((s-> pfdsParent[i][0]));
close((s-> pfdsChild[i][1]));
dup2((s-> pfdsParent[i][0]), (s-> pfdsChild[i][1]));
close((s-> pfdsParent[i][1]));
close((s-> pfdsChild[i][0]));
write(s-> pfdsParent[i][1], "test", sizeof("test"));
wait(&status); \\ see if child gets it
}
return 0;
}
子供が実行するプログラムを実行しようとすると、
read(stdin, buffer, sizeof(buffer));
printf("I have %s\n", buffer);
printf("Child done!\n);
ただし、標準入力で親から文字列を受け取りません。私が行ったことに何かひどく問題がありますか? 最終的な目標は、子から印刷して親に読んでもらい、親から子に印刷できるようにすることです。どんな助けでも大歓迎です。