【发布时间】:2010-03-30 12:01:12
【问题描述】:
我的应用程序使用lseek() 来寻找写入数据所需的位置。
该文件已使用open() 成功打开,我的应用程序能够多次使用lseek() 和write()。
在给定时间,对于某些不容易重现的用户,lseek() 返回 -1,errno 为 9。在此之前文件未关闭,文件句柄 (int) 未重置。
之后,创建另一个文件; open() 再次正常,lseek() 和 write() 再次正常工作。
更糟糕的是,该用户再次尝试了完整的序列,一切都很好。
所以我的问题是,操作系统可以出于某种原因为我关闭文件句柄吗? 什么可能导致这种情况?某种文件索引器或文件扫描器?
解决这个问题的最佳方法是什么?这个伪代码是最好的解决方案吗? (别管代码布局,会为它创建函数)
int fd=open(...);
if (fd>-1) {
long result = lseek(fd,....);
if (result == -1 && errno==9) {
close(fd..); //make sure we try to close nicely
fd=open(...);
result = lseek(fd,....);
}
}
有人有类似的经历吗?
总结:对于给定的 fd,文件查找和写入工作正常,但突然无故返回 errno=9。
【问题讨论】:
-
如果我尝试打开我的代码将无法编译(...);奇数。
-
如果 lseek() 使用 EBADF 失败,您可以很确定同一个文件描述符上的 close() 也会因 EBADF 失败。而且由于您不检查您的重新打开或重新搜索电话,任何事情都可能发生。
-
@Ger Teunis:如果您发布的是伪代码,请将其标记为伪代码,这样人们就不会抱怨(就像蒂姆所做的那样)或只是告诉您“为我工作”。尽可能避免发布伪代码——寻找尽可能小的代码来重现问题的过程是调试艺术的重要组成部分。很多时候问题出在你认为的地方,你发布的伪代码甚至不包含问题的核心(在这种情况下,文件驻留在网络挂载上)。
-
我错过了伪代码部分。对此我深表歉意,我的错,以及我在没有仔细检查的情况下使用强语言的错。
-
支持明智的驴友投票