0

我写了这段代码:

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

4

1 回答 1

3

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

于 2012-05-31T15:37:47.503 回答