【问题标题】:Where is OPEN_MAX defined for Linux systems?Linux 系统的 OPEN_MAX 定义在哪里?
【发布时间】:2012-12-12 03:26:50
【问题描述】:

OPEN_MAX 是定义单个程序允许打开的最大文件数的常量。

根据开始 Linux 编程第 4th 版,第 101 页:

限制,通常由limits.h中的常量OPEN_MAX定义,因系统而异,...

在我的系统中,/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed 目录中的文件limits.h 没有这个常量。我看错了limits.h 还是OPEN_MAX 的位置自 2008 年以来发生了变化?

【问题讨论】:

  • 另见FOPEN_MAX,在<stdio.h> 中定义——尽管@cste 评论中链接的问题可能有更多有用的信息。进程可以打开的文件数量的限制不一定是固定的。
  • @KeithThompson 我现在要求更多的是学习而不是申请。所以,没有常量OPEN_MAX ?
  • @AshRj:取决于系统。在我的 Ubuntu 系统上,有 cmets 在 /usr/include/i386-linux-gnu/bits/local_lim.h/usr/include/i386-linux-gnu/bits/xopen_lim.h 中讨论(缺少)OPEN_MAX

标签: linux gcc system-calls


【解决方案1】:

值得一提的是,Beginning Linux Programming 的第 4 版于 2007 年出版;它的一部分可能有点过时了。 (这不是对这本书的批评,我没有读过。)

至少在 Linux 系统上,OPEN_MAX 似乎已被弃用。原因似乎是可以同时打开的文件的最大数量不固定,因此扩展为整数文字的宏不是获取该信息的好方法。

还有另一个宏FOPEN_MAX 应该是类似的;我想不出为什么OPEN_MAXFOPEN_MAX(如果它们都已定义)应该具有不同值的原因。但是FOPEN_MAX 是 C 语言标准强制要求的,所以系统没有不定义它的选项。 C标准说FOPEN_MAX

扩展为一个整数常量表达式,它是最小文件数 实现保证可以同时开启

(如果“最小”这个词令人困惑,这是一个程序可以同时打开至少那么多文件的保证。)

如果你想要当前可以打开的最大文件数,看看sysconf()函数;在我的系统上,sysconf(_SC_OPEN_MAX) 返回 1024。(sysconf() 手册页指的是符号 OPEN_MAX。这不是计数,而是 sysconf() 识别的值。而且它没有在我的系统上定义。)

我在我的 Ubuntu 系统上搜索了OPEN_MAX(单词匹配,所以不包括FOPEN_MAX),发现了以下内容(这些显然只是简短的摘录):

/usr/include/X11/Xos.h:

# ifdef __GNU__
#  define PATH_MAX 4096
#  define MAXPATHLEN 4096
#  define OPEN_MAX 256 /* We define a reasonable limit.  */
# endif

/usr/include/i386-linux-gnu/bits/local_lim.h:

/* The kernel header pollutes the namespace with the NR_OPEN symbol
   and defines LINK_MAX although filesystems have different maxima.  A
   similar thing is true for OPEN_MAX: the limit can be changed at
   runtime and therefore the macro must not be defined.  Remove this
   after including the header if necessary.  */  
#ifndef NR_OPEN
# define __undef_NR_OPEN
#endif
#ifndef LINK_MAX
# define __undef_LINK_MAX
#endif
#ifndef OPEN_MAX
# define __undef_OPEN_MAX
#endif
#ifndef ARG_MAX
# define __undef_ARG_MAX
#endif

/usr/include/i386-linux-gnu/bits/xopen_lim.h:

/* We do not provide fixed values for 

   ARG_MAX      Maximum length of argument to the `exec' function
                including environment data.

   ATEXIT_MAX   Maximum number of functions that may be registered
                with `atexit'.

   CHILD_MAX    Maximum number of simultaneous processes per real
                user ID. 

   OPEN_MAX     Maximum number of files that one process can have open
                at anyone time.

   PAGESIZE
   PAGE_SIZE    Size of bytes of a page.

   PASS_MAX     Maximum number of significant bytes in a password.

   We only provide a fixed limit for

   IOV_MAX      Maximum number of `iovec' structures that one process has
                available for use with `readv' or writev'.

   if this is indeed fixed by the underlying system.
*/

【讨论】:

    【解决方案2】:

    除了 cste 给出的链接之外,我想指出,有一个 /proc/sys/fs/file-max 条目提供了系统在任何给定时间可以打开的文件数。

    这里有一些文档: https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Directory_Server/8.2/html/Performance_Tuning_Guide/system-tuning.html

    请注意,这并不是说可以保证您可以打开那么多文件 - 如果系统耗尽了某些资源(例如“没有更多可用内存”),那么它很可能会失败。

    FOPEN_MAX 表示 C 库允许打开这么多文件(至少,如所讨论的那样),但可能首先会出现其他限制。例如,SYSTEM 限制为 4000 个文件,而一些已经运行的应用程序打开了 3990 个文件。那么您将无法打开超过 7 个文件 [因为 stdin、stdout 和 stderr 也占用了三个插槽]。而如果rlimit设置为5,那么你只能打开2个自己的文件。

    在我看来,了解您是否可以打开文件的最好方法是打开它。如果失败了,你必须做其他事情。如果您有一些需要打开许多文件的进程 [例如在具有 256 个内核和每个内核 8 个线程的机器上进行多线程搜索/比较,每个线程使用三个文件(文件“A”、“B”和“diff”)],那么您可能需要确保您的 FOPEN_MAX 允许 3 * 8 * 256 个文件在开始创建线程之前被打开,因为无法打开其文件的线程将毫无意义。但是对于大多数普通应用程序,只需尝试打开文件,如果失败,告诉用户(日志或其他内容),和/或重试...

    【讨论】:

    • 当您强调 SYSTEM 时,系统与程序的运行实例是否有不同的限制?
    • @AshRj:是的,每个进程也有限制,请参阅“ulimit -n”shell 命令,或 {get,set}rlimit() 的 RLIMIT_NOFILE。
    • 已编辑以涵盖其他限制。
    【解决方案3】:

    我建议使用grep 的魔法在/usr/include 上找到这个常量:

    grep -rn --col OPEN_MAX /usr/include
    
    ...
    ...
    /usr/include/stdio.h:159:   FOPEN_MAX   Minimum number of files that can be open at once.
    ...
    ...
    

    希望对你有帮助

    【讨论】:

    • FOPEN_MAX -- 最低 ??不应该是最大值吗?
    • 除非它指的是最大值FOPEN_MAX的最小可能值?
    • @AshRj: FOPEN_MAX 承诺您可以打开至​​少那么多文件。
    • @AshRj 不知道,就是这个文件的内容。可能你的系统不一样。
    • @JoseLSegura 它在我的系统上是一样的。基思说的是正确的。
    猜你喜欢
    • 2014-01-27
    • 2014-07-12
    • 2019-08-05
    • 2020-02-27
    • 2012-06-14
    • 2013-07-13
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多