【发布时间】:2016-05-26 08:24:23
【问题描述】:
我正在编写一个从管道读取的程序,我想知道处理返回值的正确方法是什么。根据阅读手册页,
成功时,返回读取的字节数(零表示文件结束),文件位置提前该数字。如果此数字小于请求的字节数,则不是错误;这可能会发生,例如因为现在实际可用的字节较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或终端读取),或者因为 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行。 -
你对部分
read-s的担心是对的;你绝对应该缓冲和处理这些
标签: c pipe return-value