关于fread是否会阻塞的问题

nice22401 2011-04-02 10:00:30
1 fread这个函数是阻塞的吗?
2 当我读取某一个文件是否需要等到fread返回才能继续下面的操作?
3 还有,如果我读取的文件内部有错误(例如,那一块磁盘有问题,或是其他的一些问题),此时fread还能继续正常读取吗?如果读不到,fread是否会阻塞住,还是能马上返回异常?
...全文
1095 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nice22401 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caoyoubarili 的回复:]
你可以设置fd的属性为阻塞或非阻塞
[/Quote]

我用的是fopen的方式打开的,返回的是FILE×,并不是int形的数,用什么方法将FILE×转换成非阻塞??貌似fcntl函数不行吧
nice22401 2011-04-08
  • 打赏
  • 举报
回复
补充一下,Linux下出现Operation not permitted错误,而Windows上出现Broken Pipe
nice22401 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jufeng2309 的回复:]
通过下列方式把错误号和错误信息打印出来

C/C++ code

int errno;
char * mesg;
mesg = (char *)malloc(sizeof(char)*1024);
...

if (errno = ferror(fp))
{
mesg = strerror(errno);

printf("Mesg:%s\n",mesg);……
[/Quote]

不好意思又来打搅你。
我特地找来一个磨损的光盘测了一下,出现的现象是fread处确实是出现了阻塞,在这个地方阻塞了几秒钟之后才返回一个错误Operation not permitted,我希望这个函数能马上返回,有没有什么办法?fcntl函数可以吗?
jufeng2309 2011-04-02
  • 打赏
  • 举报
回复
死机只是前面你所说的阻塞的情况下才会发生。
既然都不是阻塞的,怎么还会发生呢?
有错误直接返回的。
nice22401 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jufeng2309 的回复:]
1.fread不是阻塞函数,要不就是读到了,要不就是读不到或者异常返回。
2.fread函数打开文件后如果是读写方式,则该该文件直到操作完成后,其他进程才能对其操作。
所为执行该函数后肯定会有一个返回
3.fread有异常直接会返回错误。不会阻塞等待。
[/Quote]

对于第三个问题,如果存储文件的那一块磁盘损坏了,导致在读取的时候磁头不能顺利读取到那一块内容,此时fread是直接返回吗?此时返回的错误只能通过返回值判断?还是说能通过类似于errno这样的字段去判断错误类型?
如果再严重点,如果磁头根本就卡在了损坏的部分,会出现怎样的情况?死机?还是其他的
justkk 2011-04-02
  • 打赏
  • 举报
回复
如果用fread读文件,不会阻塞
如果用来读管道、socket连接等,则可能会阻塞
yong_f 2011-04-02
  • 打赏
  • 举报
回复
1.fread不是阻塞函数,要不就是读到了,要不就是读不到或者异常返回。
2.fread函数打开文件后如果是读写方式,则该该文件直到操作完成后,其他进程才能对其操作。
所为执行该函数后肯定会有一个返回
3.fread有异常直接会返回错误。不会阻塞等待。
二狗蹲坑 2011-04-02
  • 打赏
  • 举报
回复
应该阻塞;
从文件读一定大小的数据,没内容可读则返回已读数据大小;
返回0通常是读到了文件尾。如果你确认没有到
文件尾,可以用ferror检查错误。

if ( ferror ( fp ) )
{
printf("File read error.");
}
jufeng2309 2011-04-02
  • 打赏
  • 举报
回复
1.fread不是阻塞函数,要不就是读到了,要不就是读不到或者异常返回。
2.fread函数打开文件后如果是读写方式,则该该文件直到操作完成后,其他进程才能对其操作。
所为执行该函数后肯定会有一个返回
3.fread有异常直接会返回错误。不会阻塞等待。
_TaurusYu_ 2011-04-02
  • 打赏
  • 举报
回复
你可以设置fd的属性为阻塞或非阻塞
nice22401 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jufeng2309 的回复:]
通过下列方式把错误号和错误信息打印出来

C/C++ code

int errno;
char * mesg;
mesg = (char *)malloc(sizeof(char)*1024);
...

if (errno = ferror(fp))
{
mesg = strerror(errno);

printf("Mesg:%s\n",mesg);……
[/Quote]

非常感谢!
jufeng2309 2011-04-02
  • 打赏
  • 举报
回复
通过下列方式把错误号和错误信息打印出来

int errno;
char * mesg;
mesg = (char *)malloc(sizeof(char)*1024);
...

if (errno = ferror(fp))
{
mesg = strerror(errno);

printf("Mesg:%s\n",mesg);
}


jufeng2309 2011-04-02
  • 打赏
  • 举报
回复
1、你可以通过fread后进行ferror下,把ferror返回值打印出来,找一下对应的ERRORNO,由于,没试过这种错误,所以目前也不是很清楚是多少。
errorno:http://www.tu321.com/index.php/2010/05/linux%E4%B8%8Berrno%E5%85%A8%E6%B3%A8%E9%87%8A/
2、遇到这种错误直接中断了不处理了,也就是说遇到这样的问题,直接退出循环,返回错误。
否则遇到磁盘中某块区域有问题,也是没办法。
nice22401 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jufeng2309 的回复:]
死机只是前面你所说的阻塞的情况下才会发生。
既然都不是阻塞的,怎么还会发生呢?
有错误直接返回的。
[/Quote]

1 fread出现错误的时候是以什么方式返回错误的?如果我得到fread的返回值小于0,那么我通过什么方法得到出来什么错误?我怎么判断这是磁盘损坏还是其他的什么问题?有没有类似于errno的返回值机制?
2 另外,我如果想以fread+send的方式传文件,如果文件某一块出现了问题,磁头读不过去,如果是磁头读不过去就返回,那么我下次再来读这一部分的话,也会发生同样的情况。这样的话岂不是死循环了?

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧