2

子プロセスをフォークし、子に書き込み、子から何かを読み取るのを待つ親プロセスがあると仮定すると、これを 1 つのパイプで実装できますか? 次のようになります。

int main(){
    pid_t pid1;
    int pipefd[2];
    char data[]="some data";
    char rec[20]; 

    if(pipe(pipefd) == -1){
        printf("Failed to pipe\n");
        exit(0);
    }

    pid1 = fork();
    if(pid1<0){
         printf("Fork failed\n");
         exit(0);
    }else if(pid1==0){
        close(pipefd[1]);
        read(pipefd[0],rec,sizeof(rec));
        close(pipefd[0]);
        //do some work and then write back to pipe
        write(pipefd[1],data,sizeof(data));
    }else{
        close(pipefd[0]);
        write(pipefd[1],data,sizeof(data));
        close(pipefd[1]);
        //ignoring using select() for the moment.
        read(pipedfd[0],rec,sizeof(rec));
    }

これについて詳しく学ぼうとすると、man ページには、パイプは単方向であると記載されています。これは、親と子の間で通信するパイプを作成すると、パイプに書き込むプロセスはパイプから読み取ることができなくなり、パイプから読み取るプロセスはパイプに書き込むことができなくなるということですか? これは、双方向の通信を可能にするために 2 つのパイプが必要ということですか? 何かのようなもの:

パイプ1:

P----読み取り----->C

P<---書き込み-----C

パイプ 2:

P----書き込み---->C

P<---読み取り------C

4

2 に答える 2

4

いいえ。定義上、パイプは一方向です。問題は、同期を行わないと、両方のプロセスが同じファイル記述子から読み取ることになります。ただし、セマフォを使用すると、そのようなことができます

S := semaphore initiated to 0.
P writes to pipe
P tries down on S (it blocks)
P reads from pipe

C reads from pipe
C writes to pipe
C does up on S (P wakes up and continues)

もう 1 つの方法は、2 つのパイプを使用する方法です。これは簡単です。

于 2013-04-12T08:06:07.630 に答える
1

fildes[0]書き込み用にも開いているかどうか、およびfildes[1]読み取り用にも開いているかどうかは不明です。

そうは言っても、最も簡単な方法は 2 つのパイプを使用することです。

別の方法は、パイプを介して子プロセスへのファイル記述子/名前/パスを指定することです。子プロセスでは、 に書き込む代わりに、 で指定さfiledes[1]たファイル記述子/名前/パスに書き込むことができます。 filedes[1]

于 2013-04-12T08:13:27.733 に答える