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


112

#include文字列のサイズを変更するためにPATH_MAXをintとして使用するには、どのヘッダーファイルを呼び出す必要がありますか?

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

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であることも修正しますか?


3
:この質問を参照してくださいstackoverflow.com/questions/833291/...
ジョシュ・ブラウン

18
おそらくchar current_path[PATH_MAX];代わりにchar *current_path[PATH_MAX];-ポインタの配列ではなく文字列が必要です。
ジョンカーター

またはこのいずれかのstackoverflow.com/questions/4267390/...
QDII

回答:


134

その中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に感謝)


23
ここにPATH_MAXについての良いリンクがあります...そしてそれが単にそうではない理由:insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4

ちょっと待ってください...これは、PATH_MAXがLinux固有であり、標準の一部ではないことを意味しますか?
Edward Falk

6
おそらく<limits.h>を使用する必要があります。<linux / limits.h>は明らかに移植性がありません。
Edward Falk

4
注意:PATH_MAXはNAME_MAXとは異なります(そして、x-ref'dされた記事はこれらの2つを少なくとも部分的に混同しているようです)。注:POSIXに<limits.h>よると、次のリストのいずれかの記号定数の定義は<limits.h>ヘッダーから省略されます[…]対応する値が指定された最小値以上であるが、値はファイルによって異なる場合があります。適用先。特定のパス名でサポートされる実際の値は、pathconf()関数によって提供されます。
ジョナサンレフラー

1
パス名は非常に邪悪で安全ではなく、path_maxは嘘であり、定数でもありません(OSの機能によって異なる場合があります)。これはひどい機能であり、できるだけ早く置き換える必要があります。
Lothar

13

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


4
> {PATH_MAX}パス名の最大バイト数(終端のnull文字を含む)。POSIX '01から。
muh karma

8
POSIX 2008が混乱を解決したことに注意してください— <limits.h>(根拠):{PATH_MAX} IEEE PASC Interpretation 1003.1#15は、パス名の定義と{PATH_MAX}の説明で規格の不整合に対処し、アプリケーション開発者が{PATH_MAX}または{PATH_MAX} +1バイト。{PATH_MAX}定義を修正してnull文字を含めることにより、不整合が解消されました。この変更により、以前に{PATH_MAX}バイトを割り当てたアプリケーションは引き続き成功します。
ジョナサンレフラー

1
また、を使用するべきではないがPATH_MAX - 1、も使用することに注意してくださいPATH_MAX + 1。もう必要はありませんが、に1バイトを追加し'\0'ます。
Alexis Wilke

1
PATH_MAXは、人々がウィンドウズを吸うと思う理由ですが、実際にはPATH_MAXサックを使用するのはプログラマーだけです。PATH_MAXは、Windowsでは実際には少なくとも32kであり、PATH_MAXを32kと宣言することはほとんどありません。
Lothar 2017

7

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

#define _POSIX_C_SOURCE 1
#include <limits.h>

仕様:https : //pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


そしてそれでも十分ではありません。 PATH_MAX定義する必要はありません:「次のリストのいずれかの記号定数の定義は、対応する値が指定された最小値以上であるが、値が異なる場合がある特定の実装のヘッダーから省略されるものとし<limits.h>ます。特定のパス名でサポートされている実際の値は、pathconf()関数によって提供されます。」Linuxファイルシステムがさまざまな値をサポートしていることを考えると、Linuxが定義するPOSIX標準に違反している可能性がありますPATH_MAX
Andrew Henle

1

単純なCプログラミングを行っているときも、同じ問題に直面しました。特定のLinuxシステムでは、/ usr / includeディレクトリにはLinux OSに固有の多数の、ここではヘッダーファイルが含まれています。

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が最大の番号であり、含めるには最も信頼できるものでなければなりません。別の戦略は、別の名前で自分の名前を定義することです。私の主なポイントは、findを使用して質問に対する回答を探す方法を学ぶことです。


0

PATH_MAXはシステム制限です。POSIX環境に存在するシステム制限については、3つのカテゴリがあります。これらのカテゴリの1つは、パス名変数値です。ファイルシステムに依存するシステム制限は、このカテゴリに分類されます。PATHMAXもパス名変数値です。(したがって、この値はファイルシステムによって異なる可能性があります。)したがって、PATHNAMEの制限は、pathconf()/ fpathconf() POSIX関数で取得できます。この方法は、特定のファイルシステムのPATHNAME制限を取得するポータブルな方法です。コード例は以下のようになります:

long
get_pathmax(void)
{
  long pathmax = -1;

  errno = 0;
  pathmax = pathconf("/", _PC_PATH_MAX);
  if (-1 == pathmax)
  {
    if (0 == errno)
    {
#define PATHMAX_INFINITE_GUESS 4096
      pathmax = PATHMAX_INFINITE_GUESS;
    }
    else
    {
      fprintf (stderr, "pathconf() FAILED, %d, %s\n", errno, strerror(errno));
    }
  }

  return pathmax;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.