不要なファイル記述子を閉じます。

不要なファイル記述子を閉じます。

パイプがどのように機能するかを理解したいです。このコードスニペットはウェブサイトからのものです。

したがって、プログラムの私の理解は次のとおりです。

pipe(fd)そうすれば(今までfd[0]=3、&だけ開いていたと仮定)。これで、親をフォークして子が生成されない場合、エラーで終了します。fd[0]=4012

ただし、子プロセスが正常に作成されると、ファイル記述子が子プロセスにコピーされます。サブプロセスfd[0]=3にも同じことを意味しますか?fd[1]=4ファイルハンドルはどのファイルに適用されますfd[0]fd[1](指定されていません)?

子が親から読みたいとしましょう。その後、親はオフになりfd[0]、子はオフになりますfd[1]。ところで、なぜそうなのでしょうか?閉じないとどうなりますか?私は理解できませんOn a technical note, the EOF will never be returned if the unnecessary ends of the pipe are not explicitly closed.

親が子からデータを受け取るには、fd1を閉じ、子はfd0を閉じる必要があります。親が子にデータを送信するには、fd0を閉じ、子はfd1を閉じる必要があります。記述子は親と子の間で共有されるため、気にしないパイプの端を常に閉じる必要があります。技術的に、パイプの不要な端が明示的に閉じられていない場合、EOFは返されません。

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    main()
    {
            int     fd[2];
            pid_t   childpid;

            pipe(fd);

            if((childpid = fork()) == -1)
            {
                    perror("fork");
                    exit(1);
            }

            if(childpid == 0)
            {
                    /* Child process closes up input side of pipe */
                    close(fd[0]);
            }
            else
            {
                    /* Parent process closes up output side of pipe */
                    close(fd[1]);
            }
            .
            .
    }

ベストアンサー1

Aはfork実際にフォークです。ほぼ同じ2つのプロセスが得られます。主な違いは、fork()システムコールの戻り値です。これは、次に識別される子プロセスのpidです。子プロセスで0(ソフトウェアがどのプロセスを考慮しているかを決定する方法)。(両親は子供の世話をする責任があります。)どちらが子供)。

特に、メモリが重複しているため、fd配列には同じ内容が含まれ(fd[0]1つのプロセスで3の場合は別のプロセスでは3になります)、ファイル記述子も重複します。子供のfd 3は同じことを指しますファイル説明を開く親のfd 3で。

したがって、親と子の両方のfd 3はパイプの一方の端を指し、fd[1]親と子の両方のfd 4()はパイプのもう一方の端を指します。

あるプロセスはこのパイプを使用して別のプロセスにデータを送信したいと思います。通常、プロセスの1つはfd 4に書き込まれ、他のプロセスは確認されるまでfd 3から読み取られます。ファイルの終わり

ファイルの終わりパイプの反対側に開いているすべてのfdが閉じると到達します。したがって、読者がもう一方の端でfdを閉じない限り、決して見ることはできません。ファイルの終わり

同様に、読者が死亡した場合、作成者がパイプの反対側で自分のfdを閉じない限り、書き込みを中止する必要があるという事実は決してわかりません。

おすすめ記事