gpt4 book ai didi

c - 从多个管道读取数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:33 25 4
gpt4 key购买 nike

我想做一个全连接网状拓扑模型。我有 parent 和 child ,他们使用管道相互交流。所以每个进程都必须从多个管道读取数据。我不知道该怎么做。

每个进程都有“本地 ID”作为增量(0 - 父进程、1、2、3 等)。

我创建了二维管道阵列。第一个数组 - 目的地,第二个数组 - 来源:

struct pipes_t
{
int rdwr[2];
};

struct dataIO_t
{
int processes; // number of processes
int8_t lid; // prosecc local id (0,1,2 etc)
struct pipes_t pipes[MAX_LOCAL_ID+1][MAX_LOCAL_ID+1];
};

发送多播消息的函数:

int send(struct dataIO_t* data) {
for(int i = 0; i < data->processes; i++)
if(write(data->pipes[i][data->lid].rdwr[1], "Hello world\n", 12) != 1)
return 1;
return 0;
}

如何在没有线程的情况下从任何进程的多个管道中读取数据?我尝试使用函数 dup2 将所有管道连接成一个,但这是个坏主意:

int receive(struct dataIO_t* data) {
int fd[2];
pipe(fd);

const int BSIZE = 100;
ssize_t nbytes;
char buf[BSIZE];

for(int i = 0; i < data->processes; i++)
if(i != data->lid)
if (dup2(data->pipes[data->lid][i].rdwr[0], fd[0]) == -1)
return 1;

nbytes = read(fd[0], buf, BSIZE);
printf("Msg (%d): %s\n", data->lid, buf);

return 0;
}

禁忌:在这个练习中我不能使用pollselect和相同的函数。

最佳答案

你说你想在不使用 poll、select 等的情况下读取多个文件描述符。

正如您可能已经发现的那样,您不能简单地从多个管道中的一个读取并希望它有效,因为如果没有数据,您就会阻塞。

为了解决这个问题,您可以将所有要读取的文件描述符设置为非阻塞,这意味着如果没有数据可用,从它们读取将立即返回。

在伪代码中:

for each fd in fds
mode = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, mode | O_NONBLOCK)

forever
for each fd in fds
if read(fd)
process data
sleep a little to avoid 100% CPU usage

关于c - 从多个管道读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242252/

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