私はこのコードを書きました:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define N 10
int fd[2];
void son ()
{
int data=0;
if(read(fd[0], &data, sizeof(int))==sizeof(int))
fprintf(stderr,"%d\n",data);
else
fprintf(stderr,"Read failed\n");
}
int main(int argc, char** argv)
{
pid_t sons[N];
pipe(fd);
int data=5;
for(unsigned int i=0; i<N;i++)
{
sons[i]=fork();
if(!sons[i])
{
son();
break;
}
}
write(fd[1], &data, sizeof(int));
data=6;
}
実行してみると、「5」が10回印刷されます。
どうしたの?すべてのプロセスが同じデータを読み取ったのはなぜですか?データを一度だけ読み取ることはできませんか?リーダープロセスが読み取ったデータを消費していると思いました。
私はこのようにコードを変更しました:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define N 10
int fd[2];
void son ()
{
int data=0;
if(read(fd[0], &data, sizeof(int))==sizeof(int))
fprintf(stderr,"%d\n",data);
else
fprintf(stderr,"Read failed\n");
if(read(fd[0], &data, sizeof(int))==sizeof(int))
fprintf(stderr,"%d\n",data);
else
fprintf(stderr,"Read failed\n");
}
int main(int argc, char** argv)
{
pid_t sons[N];
pipe(fd);
int data=5;
for(unsigned int i=0; i<N;i++)
{
sons[i]=fork();
if(!sons[i])
{
son();
break;
}
}
write(fd[1], &data, sizeof(int));
data=6;
write(fd[1], &data, sizeof(int));
return 0;
}
だから私は2回書き込み/読み取りをします、私が得る出力は「5」と「6」です、一度だけ、10のプロセスすべてがパイプを読み取ることができるということは起こりません。なぜこれですか?