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


112

#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라는 것도 맞습니까?


3
이 질문을 참조하십시오 : stackoverflow.com/questions/833291/…
Josh Brown

18
당신은 아마도 char current_path[PATH_MAX];대신에 char *current_path[PATH_MAX];-당신은 포인터 배열보다는 문자열을 원할 것입니다.
John Carter

답변:


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 기사는 부분적으로이 둘을 적어도 부분적으로 혼동하는 것 같습니다). 참고 : POSIX <limits.h>는 다음과 같이 말합니다. 다음 목록의 기호 상수 중 하나에 대한 정의는 <limits.h>헤더 […]에서 생략되어야합니다 . 여기서 해당 값은 명시된 최소값보다 크거나 같지만 값은 파일에 따라 다를 수 있습니다. 적용됩니다. 특정 경로명에 지원되는 실제 값은 pathconf () 함수에 의해 제공됩니다.
Jonathan Leffler

1
경로 이름은 매우 사악하고 안전하지 않으며 path_max는 거짓말이며 상수도 아닙니다 (OS 기능에 따라 다를 수 있음). 끔찍한 기능이므로 최대한 빨리 교체해야합니다.
Lothar

13

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


4
> {PATH_MAX}종료 널 문자를 포함하여 경로 이름의 최대 바이트 수. POSIX '01에서.
muh karma 2014 년

8
POSIX 2008은 혼란을 해결했습니다. <limits.h>(이유) : {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15는 경로 이름의 정의와 {PATH_MAX}의 설명으로 표준의 불일치를 해결하여 응용 프로그램 개발자가 {PATH_MAX} 또는 {PATH_MAX} +1 바이트. 널 문자를 포함하도록 {PATH_MAX} 정의를 수정하여 불일치를 제거했습니다. 이 변경으로 이전에 {PATH_MAX} 바이트를 할당 한 애플리케이션은 계속 성공합니다.
Jonathan Leffler

1
PATH_MAX - 1,하지만을 사용해서는 안됩니다 PATH_MAX + 1. 더 이상 필요하지 않지만 '\0'.
Alexis Wilke

1
PATH_MAX는 사람들이 창을 짜증나게 생각하는 이유이지만 사실 PATH_MAX를 사용하는 것은 프로그래머뿐입니다. PATH_MAX는 실제로 Windows에서 32k 이상이며 PATH_MAX를 32k로 선언하는 것을 거의 원하지 않습니다.
Lothar

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에서 .NET Framework를 정의하는 것은 POSIX 표준을 위반 한 것일 수 PATH_MAX있습니다.
Andrew Henle

1

간단한 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은 대부분의 실제 상황에서 충분히 길다). 내 요점은 찾기를 사용하여 질문에 대한 답을 찾는 방법을 배우는 것입니다.


0

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.