我写了这段代码:
#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个进程都可以读取管道。为什么?
答案 0 :(得分:3)
当你fork()时执行son(),然后跳出循环 - 但这不是子进程的结束!然后孩子继续并写入fd [1]。