価値のあることとしては、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_MAX
sysconf()
OPEN_MAX
Ubuntu システムで(単語が一致するため、 を除く)を検索した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.
*/