我正在编写一个程序来读取管道,我想知道处理返回值的正确方法是什么。根据所读取的手册页,从管道读取:如何处理c中的返回值?
成功时返回读取的字节数(零表示文件结束),并且文件位置按该数字提前。如果此数字小于请求的字节数,则不是错误;这可能会发生,例如因为现在实际上可用的字节更少(可能因为我们接近文件结束,或者因为我们正在从管道读取数据或从终端读取数据),或者因为read()被中断信号。
我很担心它只能读取一半数据的情况。另外,当返回值为零时,处理这种情况的正确方法是什么?
这是我的示例代码。
struct day
{
int date;
int month;
};
while(1)
{
ret = select(maxfd+1, &read_fd, NULL, &exc_fd,NULL);
if(ret < 0)
{
perror("select");
continue;
}
if(FD_ISSET(pipefd[0], &read_fd))
{
struct day new_data;
if((ret = read(pipefd[0], &new_data, sizeof(struct day)))!= sizeof(struct day))
{
if(ret < 0)
{
perror("read from pipe");
continue;
}
else if(ret == 0)
{
/*how to handle?*/
}
else
/* truncated read. How to handle?*/
}
}
...
}
我相信read()不能读取比指定大小更多的数据。如果我错了,请纠正我。
请帮我处理读取的返回值。
请张贴工作的例子。你的代码不会编译。检查'if((ret = pipefd' line。 – ceving
你是对的,担心部分'read' -s;你肯定应该缓冲并处理这些 –