lseek/write 突然返回 -1 且 errno = 9(错误文件描述符)

2023-12-19

我的应用程序使用lseek()寻找所需的位置来写入数据。 文件已成功打开,使用open()我的应用程序能够使用lseek() and write()很多次。

在给定时间,对于某些用户来说并且不容易重现,lseek()返回 -1 并带有errno9. 在此之前文件未关闭且文件句柄 (int) 未重置。

之后,另一个文件被创建;open()又好了lseek() and 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。


所以我的问题是,操作系统可以出于某种原因为我关闭文件句柄吗?什么可能导致>这个?某种文件索引器或文件扫描器?

不,这不会发生。

解决这个问题的最佳方法是什么?是 这个伪代码是最好的解决方案吗? (不用介意代码布局,会 为其创建函数)

不,最好的方法是找到错误并修复它。

有人有类似经历吗?

我多次看到 fds 被搞乱,在某些情况下导致 EBADF, 并在其他方面引起轰动,它是:

  • 缓冲区溢出 - 溢出某些内容并将无意义的值写入“int fd;”多变的。
  • 由于某些极端情况而发生的愚蠢错误if(fd = foo[i].fd)当他们的意思是if(fd == foo[i].fd)
  • 线程之间的竞争条件,某些线程关闭了其他线程想要使用的错误文件描述符。

如果您能找到重现此问题的方法,请在“strace”下运行您的程序,以便您可以看到发生了什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lseek/write 突然返回 -1 且 errno = 9(错误文件描述符) 的相关文章

随机推荐