Chinaunix

标题: fsync 是否可以被中断 [打印本页]

作者: river617    时间: 2010-09-08 19:43
标题: fsync 是否可以被中断
我的程序中调用 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);

但是我测试,好像没有作用。
作者: l.darkfire    时间: 2010-09-08 21:01
3秒已经刷完了吧
作者: river617    时间: 2010-09-08 22:41
不一定啊,假如有其他进程大量写文件,刷磁盘 例如:dd 创建一个大文件的时候,我的程序就刷不完。
作者: l.darkfire    时间: 2010-09-08 22:48
要正好处在睡眠状态时被中断打断,然后醒来,才会返回EINTR吧。
作者: river617    时间: 2010-09-08 23:05
楼上的意思是,如果我call 的 fsync 在 睡眠的时候,可以被alarm信号中断?

我测试发现,每次fsync都是成功的,而且返回之后,处理了alarm信号,我通过MySigAlarmHandler 中加日志看到的。
作者: l.darkfire    时间: 2010-09-09 07:44
你希望fsync由于被信号中断而返回。
但是,一个系统调用内部处理时,一般是在睡眠醒来时再去判断一下是不是由于被信号打断而醒的,如果是则返回EINTR。
也就是说,如果信号发生的时候,fsync内部正好不是处在睡眠状态,而是在做处理,那么它不会因此返回。否则你想啊,它不可能时时刻刻去检测有没有信号产生
作者: l.darkfire    时间: 2010-09-09 09:47
刚才看了下源代码,fsync可能会睡眠在TASK_UNINTERRUPTIBLE状态。
作者: river617    时间: 2010-09-09 15:29
谢谢楼上。

这样看来,我没有办法中断 fsync了。
作者: l.darkfire    时间: 2010-09-09 15:37
fsync确实不会返回EINTR,也就意味着它应该在TASK_UNINTERRUPTIBLE上睡眠。
作者: river617    时间: 2010-09-09 15:42
楼上是高手啊。
作者: l.darkfire    时间: 2010-09-09 15:46
高手谈不上,大家互相学习。
作者: l.darkfire    时间: 2010-09-09 15:49
如果你的本意是不想让fsync阻塞当前程序的执行路径,那么你可以fork子进程去做fsync.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2