我想逐行读取文件描述符,直到没有其他内容可读。我希望read(2)在文件描述符的末尾到达时返回零,但相反,它似乎等待文件描述符被关闭。我想避免关闭我的文件描述符,因为我还要写更多内容。
以下是我所做的一个全面的例子:
#include <stdio.h>
#include <stdlib.h>
size_t read_line(int fd, char* buffer);
int main()
{
int fd[2];
if (pipe(fd) != 0) {
fprintf(stderr,"Pipe error.\n");
exit(1);
}
if (fork() == 0) {
close(fd[0]);
int i;
for (i = 0; i < 10; ++i)
dprintf(fd[1], "FOO\n");
pause();
exit(0);
}
close(fd[1]);
char buffer[20];
while (read_line(fd[0], buffer) > 0)
printf("%s\n", buffer);
printf("BAR !!\n");
exit(0);
}
size_t read_line(int fd, char* buffer)
{
char char_buf;
size_t buffer_size = 0;
while (read(fd, &char_buf, 1) > 0 && char_buf != '\n')
buffer[buffer_size++] = char_buf;
buffer[buffer_size] = '\0';
return buffer_size;
}
我的read_line函数应该在结尾返回零。如果我替换“pause();”它可以正常工作“关闭(fd [1]);”,但显然,这不是我的目标,因为我会避免松开管道。
谢谢!
答案 0 :(得分:1)
无法通过检查read的返回值来做到这一点。原因是当文件描述符为空时,读取将仅等待。您的问题类似于等待直到没有scanf的任何输入,如果这样可以使您更容易理解。
一个解决方案是有一个特定的值,该值将停止循环。例如,如果您正在读取非负整数,则该值为-1。
另一个解决方案来自以下事实:如果管道为空,并且没有进程打开该管道进行写入,则读取返回0。因此,在完成写入后,请关闭文件分离器p [1]。(p [1 ]也必须在发送者进程中关闭)。