【问题标题】:Can rename fail if not enough file descriptors?如果没有足够的文件描述符,重命名会失败吗?
【发布时间】:2013-03-01 04:41:08
【问题描述】:

我注意到在 fd 泄漏期间,当达到文件描述符的上限时,重命名调用失败。不幸的是,我没有错误代码。

会不会是文件描述符缺失与重命名失败有关?

据我所知,在 rename() 的实现中使用了 link() 系统调用。需要fd吗?

使用的重命名实现来自\glibc-2.17\sysdeps\posix\

【问题讨论】:

  • 重命名失败的 errno 是什么?
  • 没有。 Rename 是一个不会与文件描述符混淆的系统调用;并且系统调用是原子的,因此,重命名可能会失败。 BTW:重命名是目录操作;内核需要为该目录​​打开一个 inode。
  • 很遗憾没有保存。

标签: c linux rename glibc


【解决方案1】:

rename 的故障模式在手册页上清楚地列出:

http://www.manpagez.com/man/2/rename/

它没有提到打开文件太多是个问题。

【讨论】:

    【解决方案2】:

    我编译了这个程序:

    #include <stdio.h>
    
    int main()
    {
        rename("a", "a1");
    }
    

    并在可执行文件上运行strace。一旦初始化代码完成,所发生的就是:

    rename("a", "a1")                       = 0
    exit_group(0)                           = ?
    

    即没有对 open 新文件描述符的系统调用。

    【讨论】:

    • 确实 rename 不使用任何 fd。间接地,问题是由于没有创建要重命名的文件而导致缺少描述符。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2011-11-09
    • 2013-08-02
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多