7

OPEN_MAX1 つのプログラムで開くことができるファイルの最大数を定義する定数です。

Beginning Linux Programming4版によると、101 ページ:

通常、limits.h の定数 OPEN_MAX によって定義される制限は、システムごとに異なります...

limits.h私のシステムでは、ディレクトリ内 のファイルに/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixedはこの定数がありません。私の見方が間違っているのでしょうかlimits.h、それとも の場所がOPEN_MAX2008 年以降に変更されたのでしょうか?

4

3 に答える 3

6

価値のあることとしては、Beginning Linux Programmingの第 4 版が2007 年に発行されました。その一部は少し古くなっている可能性があります。(これは私が読んだことのない本に対する批判ではありません。)

OPEN_MAX少なくとも Linux システムでは非推奨のようです。その理由は、同時に開くことができるファイルの最大数が固定されていないためと思われるため、整数リテラルに展開するマクロはその情報を取得する良い方法ではありません。

FOPEN_MAX同様のマクロがもう 1 つあります。とが両方とも定義されている場合、異なる値を持つべきOPEN_MAX理由が思いつきません。FOPEN_MAXただしFOPEN_MAX、C 言語標準によって義務付けられているため、システムにはそれを定義しないオプションがありません。C標準はそれを言いますFOPEN_MAX

実装が同時に開くことができるファイルの最小数である整数定数式に展開されます

(「最小」という言葉が紛らわしい場合は、プログラムが一度に少なくともその数のファイルを開くことができることを保証します。)

開くことができるファイルの現在の最大数が必要な場合は、sysconf()関数を見てください。私のシステムでは、 sysconf(_SC_OPEN_MAX)1024 が返されsysconf()ます。OPEN_MAXsysconf()

OPEN_MAXUbuntu システムで(単語が一致するため、 を除く)を検索した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.
*/
于 2012-12-27T16:18:12.550 に答える
5

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 ライブラリがこの数のファイルを開くことを許可していることを示します (少なくとも、説明したように) が、最初に発生する可能性のある他の制限があります。たとえば、システムの制限が 4000 ファイルで、すでに実行中の一部のアプリケーションで 3990 ファイルが開かれているとします。そうすると、7 つを超えるファイルを開くことができなくなります [stdin、stdout、stderr も 3 つのスロットを占有するため]。が 5 に設定されている場合rlimit、自分のファイルは 2 つしか開くことができません。

私の意見では、ファイルを開くことができるかどうかを知る最善の方法は、ファイルを開くことです。それが失敗した場合は、何か他のことをしなければなりません。多くのファイルを開く必要があるプロセスがある場合 [たとえば、256 コアとコアあたり 8 スレッドのマシンでのマルチスレッド検索/比較で、各スレッドが 3 つのファイル (ファイル "A"、"B"、"diff") を使用する場合]の場合、スレッドの作成を開始する前に、FOPEN_MAX で 3 * 8 * 256 個のファイルを開くことができることを確認する必要がある場合があります。ファイルを開けないスレッドは意味がないからです。しかし、ほとんどの通常のアプリケーションでは、ファイルを開いてみてください。失敗した場合は、ユーザーに知らせて (ログなど)、もう一度やり直してください...

于 2012-12-26T16:49:04.533 に答える
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.
...
...

お役に立てば幸いです

于 2012-12-26T16:19:39.533 に答える