免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6943 | 回复: 10
打印 上一主题 下一主题

[C] 如何实现文件读写超时控制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-20 15:23 |只看该作者 |倒序浏览
读写文件的时候,在极端的情况下,可能会遇到读写文件超时的情况。
目前只能想到两个解决方法:
1. 采用信号的方式。用alarm来控制,但是在多线程环境下,时间上会发生冲突。
2. 对于每一个读操作或者写操作,创建一个新的线程,然后在线程内部进行读写操作,由主线程负责时间的控制。但是这种方式对系统资源是很大的消耗。

请问大家有没有什么好一些方法能够实现文件的读写超时控制。谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-01-20 15:29 |只看该作者
select

论坛徽章:
0
3 [报告]
发表于 2009-01-20 15:47 |只看该作者

回复 #2 cugb_cat 的帖子

你好,我描述的情形可能不太清楚。我说的情况代码如下:

fd = open(FILE, O_RDWR | O_APPEND);

write(fd, buffer, sizeof(buffer);

fd是一个普通的文件,在极端的情况下(可能是磁盘出现问题),write可能会一直阻塞而不返回。我想知道如何能够实现write的超时控制。

[ 本帖最后由 wzabcd1234 于 2009-1-20 15:48 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-01-20 15:50 |只看该作者
设置为非阻塞模方式

论坛徽章:
0
5 [报告]
发表于 2009-01-20 15:56 |只看该作者

回复 #4 jiean 的帖子

恩,我先试一下,谢谢提醒啊。

论坛徽章:
0
6 [报告]
发表于 2009-01-20 16:20 |只看该作者
O_NDELAY Opens with no delay.

O_NONBLOCK Specifies that the open subroutine should not block.

The O_NDELAY flag and the O_NONBLOCK flag are identical except for the value
returned by the read and write subroutines. These flags mean the process does
not block on the state of an object, but does block on input or output to a
regular file or block device.

刚才测试了一下,以非阻塞方式打开文件,写文件还是以阻塞的方式返回的。代码如下:

fd = open(FILE, O_RDWR | O_NONBLOCK | O_NDELAY);
char * buffer;
buffer = malloc(200 * 1024 * 1024);
write(fd, buffer, size);

有没有其他的什么方法啊,谢谢!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
7 [报告]
发表于 2009-01-20 16:43 |只看该作者
FreeBSD的kqueue,Windows平台的异步IO可以满足你的要求,Linux的异步IO没有用过,不太清楚

论坛徽章:
0
8 [报告]
发表于 2009-01-20 16:48 |只看该作者

回复 #7 xinglp 的帖子

恩,谢谢,回去试一下。

论坛徽章:
0
9 [报告]
发表于 2009-01-20 21:05 |只看该作者
考虑过多线程并发写文件时候的处理了吗?

论坛徽章:
0
10 [报告]
发表于 2009-01-21 10:12 |只看该作者
2# 7#正解。
2楼的可以用于任何支持select的平台(目前常见的非嵌入式系统都支持)。非阻塞是马上返回,但并不代表操作完成。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP