我写了这段代码:
#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;
}
如果我尝试执行它,我会打印 10 次“5”。
发生了什么?为什么所有进程都读取了相同的数据?数据不能只读取一次吗?我认为阅读器进程正在消耗读取的数据。
我这样修改了代码:
#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;
}
所以我写/读了两次,我得到的输出是“5”和“6”,只有一次,不会发生所有10个进程都可以读取管道的情况。为什么会这样?