Linux中定义PATH_MAX在哪里?
我应该用#include
调用哪个头文件,以便能够使用PATH_MAX作为string大小的整数?
我想能够声明:
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]; ^
我试图做一个谷歌search,但仍然没有运气。
#include <limits.h>
不解决问题/错误。
我也正确的说,PATH_MAX的值是一个int?
它在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)
请注意,目前还不清楚PATH_MAX
定义了最大长度,有无最终字节。 它可能是在不同的操作系统上的一个或另一个。 如果你不能或者不想检查在编译过程中是哪种情况,那么强制PATH_MAX - 1
人为限制是比较安全的。 比对不起更安全。 (显然,您仍然需要至less保留PATH_MAX
字节的内存来缓冲string。)
这是一个很好的问题。 我正在做一些简单的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对于大多数实际情况来说足够长)。 如果这是一个大的软件包,你也可以控制。 这是我的意见。