免费注册 查看新帖 |

Chinaunix

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

fsync 是否可以被中断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-08 19:43 |只看该作者 |倒序浏览
我的程序中调用 fsync 之将程序写的文件刷新到磁盘上, 我想给 fsync 加一个超时限制。

            write_timeout.it_value.tv_sec = 3;
            write_timeout.it_value.tv_usec = 0;
            write_timeout.it_interval.tv_sec = 0;
            write_timeout.it_interval.tv_usec = 0;
            setitimer(ITIMER_REAL,&write_timeout,NULL);
            signal(SIGALRM, MySigAlarmHandler);

            ret = fsync(fd);

但是我测试,好像没有作用。

论坛徽章:
0
2 [报告]
发表于 2010-09-08 21:01 |只看该作者
3秒已经刷完了吧

论坛徽章:
0
3 [报告]
发表于 2010-09-08 22:41 |只看该作者
不一定啊,假如有其他进程大量写文件,刷磁盘 例如:dd 创建一个大文件的时候,我的程序就刷不完。

论坛徽章:
0
4 [报告]
发表于 2010-09-08 22:48 |只看该作者
要正好处在睡眠状态时被中断打断,然后醒来,才会返回EINTR吧。

论坛徽章:
0
5 [报告]
发表于 2010-09-08 23:05 |只看该作者
楼上的意思是,如果我call 的 fsync 在 睡眠的时候,可以被alarm信号中断?

我测试发现,每次fsync都是成功的,而且返回之后,处理了alarm信号,我通过MySigAlarmHandler 中加日志看到的。

论坛徽章:
0
6 [报告]
发表于 2010-09-09 07:44 |只看该作者
你希望fsync由于被信号中断而返回。
但是,一个系统调用内部处理时,一般是在睡眠醒来时再去判断一下是不是由于被信号打断而醒的,如果是则返回EINTR。
也就是说,如果信号发生的时候,fsync内部正好不是处在睡眠状态,而是在做处理,那么它不会因此返回。否则你想啊,它不可能时时刻刻去检测有没有信号产生

论坛徽章:
0
7 [报告]
发表于 2010-09-09 09:47 |只看该作者
刚才看了下源代码,fsync可能会睡眠在TASK_UNINTERRUPTIBLE状态。

论坛徽章:
0
8 [报告]
发表于 2010-09-09 15:29 |只看该作者
谢谢楼上。

这样看来,我没有办法中断 fsync了。

论坛徽章:
0
9 [报告]
发表于 2010-09-09 15:37 |只看该作者
fsync确实不会返回EINTR,也就意味着它应该在TASK_UNINTERRUPTIBLE上睡眠。

论坛徽章:
0
10 [报告]
发表于 2010-09-09 15:42 |只看该作者
楼上是高手啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP