[c] Linux에서 PATH_MAX는 어디에 정의되어 있습니까?

#includePATH_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];
                   ^

Google 검색을 시도했지만 여전히 운이 없습니다.

#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후행 nul 바이트를 포함하거나 포함하지 않고 최대 길이를 정의 하는지 여부는 여전히 명확하지 않습니다 . 다른 운영 체제에서 둘 중 하나 일 수 있습니다. 컴파일하는 동안 어떤 경우인지 확인할 수 없거나 확인하고 싶지 않은 경우 인위적으로 PATH_MAX - 1. 죄송합니다보다 더 안전. (분명히 PATH_MAX문자열을 버퍼링하기 위해 적어도 바이트 이상의 메모리를 예약해야 합니다.)


답변

휴대용 방법은 다음과 같습니다.

#define _POSIX_C_SOURCE 1
#include <limits.h>

사양 : https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


답변

간단한 C 프로그래밍을 할 때도 같은 문제에 직면했습니다. 특정 Linux 시스템에서 / usr / include 디렉토리에는 Linux OS에 특정한 많은 헤더 파일이 포함되어 있습니다.

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

PATH_MAX를 정의하는 여러 헤더가 표시되어야합니다. 안타깝게도이 값은 다른 헤더에서 다르게 정의되었습니다. 다음은 내 우분투의 목록입니다 (저는 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은 대부분의 실제 상황에서 충분히 길다). 내 요점은 찾기를 사용하여 질문에 대한 답을 찾는 방법을 배우는 것입니다.


답변

PATH_MAX는 시스템 한계입니다. POSIX 환경에는 시스템 제한에 대한 세 가지 범주가 있습니다. 이러한 범주 중 하나는 경로 이름 변수 값 입니다. 파일 시스템에 따른 시스템 제한이이 범주에 속합니다. 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;
}


답변