代码之家  ›  专栏  ›  技术社区  ›  Michal Kordas FrantiÅ¡ek Hartman

IOException:关闭文件流时权限被拒绝

  •  1
  • Michal Kordas FrantiÅ¡ek Hartman  · 技术社区  · 7 年前

    在远程机器上,我观察到了无法复制或解释的异常。

    多年来,同样的程序一直在运行,没有任何问题。正在将多个类似的文件从scp下载到redhat linux上的共享网络位置,确保磁盘上有可用空间,并且所有权限都正常。只打开了几个文件描述符。今天,突然,在写最后一个文件的时候 java.io.IOException: Permission denied 虽然 关闭 流,但文件已正确保存。

    这种例外的可能原因是什么? 除了映射之外,我还没有在Java源代码中找到任何东西。 Permission denied EACCES . 当我浏览互联网时,我只在人们 权限被拒绝 打开溪流,但不关闭它。

    java.io.IOException: Permission denied
      at java.io.FileOutputStream.close0(Native Method)
      at java.io.FileOutputStream.access$000(FileOutputStream.java:53)
      at java.io.FileOutputStream$1.close(FileOutputStream.java:356)
      at java.io.FileDescriptor.closeAll(FileDescriptor.java:212)
      at java.io.FileOutputStream.close(FileOutputStream.java:354)
      at java.io.FilterOutputStream.close(FilterOutputStream.java:159)
      at com.aestasit.ssh.dsl.ScpMethods.doGet(ScpMethods.groovy:249)
      at com.aestasit.ssh.dsl.ScpMethods.this$2$doGet(ScpMethods.groovy)
      at com.aestasit.ssh.dsl.ScpMethods.download(ScpMethods.groovy:162)
      at com.aestasit.ssh.dsl.SshDslEngine.executeSession(SshDslEngine.groovy:70)
      at com.aestasit.ssh.dsl.SshDslEngine$remoteSession.call(Unknown Source)
      at com.aestasit.ssh.DefaultSsh.remoteSession(DefaultSsh.groovy:46)
      at com.aestasit.ssh.DefaultSsh$remoteSession.callStatic(Unknown Source)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Stephen C    7 年前

    这只是一个理论…

    从Linux内核源代码来看,在某些情况下 close(fd) 系统调用将在关闭前尝试进行内部刷新。如果一个 fd 与“文件系统”上的文件关联,在该文件打开时可以更改有效的访问权限,因此可以想象关闭刷新可能失败,因为 现在的 权限限制太多。这将导致eacces系统调用失败。

    这样的失败是罕见的,因为在触发失败的“正确”时间更改文件的权限是不寻常的;即 close syscall和上一个 write 小精灵。

    此外,可以想象,这只会发生在某些类型的文件上;例如,远程文件服务器上的文件,其中远程服务器实现访问控制。


    注意 close() Linux手动条目或POSIX规范并没有设想EACCES失败。这些文档暗示只有在打开文件时才检查访问权限,这(至少)是意外行为。

    然而,另一方面,(虚拟)文件系统行为的各个方面都依赖于文件系统本身的实现。还有一些情况下,文件系统的行为并不“正常”。

    推荐文章