我使用fork()创建了两个进程。子进程正在生成并向管道连续写入可变数量的数据(数组char)。父进程从管道读取并将接收到的数据打印到标准输出。通过管道读取和写入数据
的代码非常简单:
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
,这不应该发生:
写入管道写端的数据由 内核缓冲,直到它被从管道的读端读取。
以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
任何人都知道这里发生了什么?
不是没有代码显示的写作,也许一些示例输出。 –
究竟是什么问题? Minor nitpick:read()不读取以空字符结尾的字符串。你的%s格式需要一个nul结尾的字符串。也许你应该添加“readbuffer [n] = 0;”阅读后,给予足够的空间。 – wildplasser
感谢您的意见。我刚刚编辑了一些更多信息的问题。 – alnacle