gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:38 25 4
gpt4 key购买 nike

我写了这段代码:

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

最佳答案

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

关于c - 管道允许多个进程读取相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com