web-dev-qa-db-ja.com

LinuxのPATH_MAXはどこで定義されていますか?

#includeでどのヘッダーファイルを呼び出して、文字列のサイズを決定するためのintとしてPATH_MAXを使用できるようにしますか?

宣言できるようにしたい:

char *current_path[PATH_MAX];

しかし、そうすると、コンパイラ(LinuxのClang/LLVM)が次のエラーを発行します。

recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
                   ^

私はグーグル検索を試しましたが、それでも運はありませんでした。

#include <limits.h>は、問題/エラーを修正しません。

PATH_MAXの値がintであることも修正できますか?

98
haziz

linux/limits.hにあります。
#define PATH_MAX 4096 /* # chars in a path name including nul */

#include <linux/limits.h>

char current_path[PATH_MAX];

PATH_MAXには、 このブログ (paulsm4に感謝)に記載されているいくつかの欠陥があります。

124
Shiplu Mokaddim

PATH_MAXが末尾のヌルバイトの有無にかかわらず最大長を定義するかどうかはまだ不明であることに注意してください。異なるオペレーティングシステム上のいずれかです。コンパイル中かどうかを確認できない場合、またはしたくない場合は、PATH_MAX - 1の人為的な制限を強制する方が安全です。転ばぬ先の杖。 (明らかに、文字列をバッファリングするには少なくともPATH_MAXバイトのメモリを予約する必要があります。)

12
Kumashiro

これはいい質問です。簡単なCプログラミングを行っているときに、この問題が発生しました。特定のLinux/Unixの/ usr/includeディレクトリに、システムのすべてのヘッダーファイルがあります。

find . -name "*.h" | xargs grep PATH_MAX 

PATH_MAXを定義するいくつかのヘッダーが表示されます。また、この値は場所によって異なる方法で定義されていることがわかります。 Ubuntuのリストを次に示します(grepプログラムからいくつかの誤検出ヒットを手動で削除しました)。

./x86_64-linux-gnu/bits/posix1_lim.h:#define _POSIX_PATH_MAX      256
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX 512
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX MAXPATHLEN
./X11/InitialI.h:#define PATH_MAX 1024
./X11/Xos.h:#  define PATH_MAX 4096
./X11/Xwindows.h:#if defined(WIN32) && (!defined(PATH_MAX) || PATH_MAX < 1024)
./X11/Xwindows.h:# undef PATH_MAX
./X11/Xwindows.h:# define PATH_MAX 1024
./X11/Xosdefs.h:#  ifndef PATH_MAX
./X11/Xosdefs.h:#   define PATH_MAX 4096
./X11/Xosdefs.h:#  ifndef PATH_MAX
./X11/Xosdefs.h:#   define PATH_MAX 1024
./X11/extensions/XKBsrv.h:#define   PATH_MAX MAXPATHLEN
./X11/extensions/XKBsrv.h:#define   PATH_MAX 1024
./python2.7/osdefs.h:#ifndef PATH_MAX
./python2.7/osdefs.h:#define PATH_MAX MAXPATHLEN
./python2.7/osdefs.h:#if defined(PATH_MAX) && PATH_MAX > 1024
./python2.7/osdefs.h:#define MAXPATHLEN PATH_MAX
./linux/limits.h:#define PATH_MAX        4096   /* # chars in a path name including nul */
./linux/btrfs.h:#define BTRFS_INO_LOOKUP_PATH_MAX 4080
./linux/un.h:#define UNIX_PATH_MAX  108

/linux/limits.hに定義されている最大の番号があるように見えます。このファイルの移植性について心配しています。したがって、安全のために、このマクロを別の名前、たとえばPATHLEN(4080はほとんどの実用的な状況では十分な長さ)で自分で簡単に定義できます。これが大規模なソフトウェアパッケージ用である場合は、制御することもできます。これは私の意見。

2
Kemin Zhou

ポータブルな方法は次のとおりです。

#define _POSIX_C_SOURCE 1
#include <limits.h>
0
emersion