パイプがどのように機能するかを理解したいです。このコードスニペットはウェブサイトからのものです。
したがって、プログラムの私の理解は次のとおりです。
pipe(fd)
そうすれば(今までfd[0]=3
、&だけ開いていたと仮定)。これで、親をフォークして子が生成されない場合、エラーで終了します。fd[0]=4
0
1
2
ただし、子プロセスが正常に作成されると、ファイル記述子が子プロセスにコピーされます。サブプロセス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を閉じない限り、書き込みを中止する必要があるという事実は決してわかりません。