管道允许多个进程读取相同的数据

时间:2012-05-31 15:31:15

标签: c macos pipe

我写了这段代码:

#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个进程都可以读取管道。为什么?

1 个答案:

答案 0 :(得分:3)

当你fork()时执行son(),然后跳出循环 - 但这不是子进程的结束!然后孩子继续并写入fd [1]。