gpt4 book ai didi

c - 通过管道读取和写入数据

转载 作者:行者123 更新时间:2023-12-04 06:15:14 25 4
gpt4 key购买 nike

我使用 fork() 创建了两个进程。子进程正在生成并将可变数量的数据(数组字符)连续写入管道。父进程从管道中读取数据并将接收到的数据打印到标准输出。

代码非常简单:

switch (fork()) {
case -1:
exit (1);
break;
case 0:
close(fd[0]);
generate_data(fd[1]);
break;
default:
close(fd[1]);
while(1) {
n = read(fd[0], readbuffer, sizeof(readbuffer));
readbuffer[n] = 0;
if (n > 0)
printf ("read: %s\n", readbuffer);
else
exit(1);
}
break;
}

在哪里 generate_data(int)遍历一个列表,将每个元素(字符串)写入作为参数给出的文件描述符(在这种情况下是管道的写入端):
void generate_data(int fd) 
{
node_t node* = list;
while (node != NULL) {
write(fd, node->data, strlen(node->data)+1);
node = node->next();
}

}

这里的问题是输出总是不可预测的:当另一个进程正在处理最后一个 read 时,子进程将数据写入管道。 ,因此当它再次调用读取时,其余数据不再存在。

根据 man 2 pipe ,这不应该发生:

Data written to the write end of the pipe is buffered by the kernel until it is read from the read end of the pipe.



列出 10 个元素,一些输出示例:

示例 1:
read: element_4
read: element_8
read: element_9

示例 2:
read: element_7
read: element_8
read: element_9
read: element_10

示例 3:
read: element_2
read: element_8

有人知道这里发生了什么吗?

最佳答案

您调用read并捕获返回值,但随后您在很大程度上忽略了它;它告诉你 readbuffer 中有多少有效字节,但您正在治疗 readbuffer好像它包含一个以零结尾的字符串,但它不一定。其实单read如果您的数据写入过程正在发送 0,则可能会为您提供多个以零结尾的字符串通过管道的字节;使用 printf意味着您忽略了第二个和后续的。至少,您需要使用 fwrite将特定的正确字节数写入标准输出,尽管我怀疑您实际上需要做的是首先用换行符替换那些零。修改 generate_data 可能是一个更好的主意发送换行符而不是零。

关于c - 通过管道读取和写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334393/

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