在Linux中定义PATH_MAX在哪里?

时间:2012-02-25 23:54:25

标签: c linux gcc include clang

我应该使用#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?

5 个答案:

答案 0 :(得分:123)

它在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有一些瑕疵,如this blog所述(感谢paulsm4)

答案 1 :(得分:12)

请注意,仍然不清楚PATH_MAX是否定义了包含或不包含尾随空字节的最大长度。它可能是不同操作系统中的一个或另一个。如果您不能或不想在编译期间检查它是哪种情况,则强制PATH_MAX - 1的人为限制会更安全。比抱歉更安全。 (显然,您仍需要保留至少PATH_MAX个字节的内存来缓冲字符串。)

答案 2 :(得分:2)

这是一个很好的问题。我正在做一些简单的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具有最大的定义数量。我关心这个文件的可移植性。所以为了安全起见,你可能只是用一个不同的名字来定义这个MACRO,比如PATHLEN(4080对于大多数实际情况来说足够长)。如果这是一个大型软件包,你也可以控制。这是我的意见。

答案 3 :(得分:0)

便携式方法是:

#define _POSIX_C_SOURCE 1
#include <limits.h>

答案 4 :(得分:0)

PATH_MAX是系统限制。 POSIX环境中存在关于系统限制的三类。这些类别之一是路径名变量值。取决于文件系统的系统限制属于此类别。 PATHMAX也是路径名变量值。 (因此,此值可以在文件系统之间更改。) 所以, 可以使用 pathconf()/ fpathconf() POSIX函数获得PATHNAME限制。这种方式是获取特殊文件系统的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;
}