1

(とりわけ) 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); 

ただし、標準入力で親から文字列を受け取りません。私が行ったことに何かひどく問題がありますか? 最終的な目標は、子から印刷して親に読んでもらい、親から子に印刷できるようにすることです。どんな助けでも大歓迎です。

4

0 に答える 0