PATH_MAX được định nghĩa ở đâu trong Linux?


112

Tôi nên gọi tệp tiêu đề nào #includeđể có thể sử dụng PATH_MAX làm int để định cỡ chuỗi?

Tôi muốn có thể khai báo:

char *current_path[PATH_MAX];

Nhưng khi tôi làm như vậy trình biên dịch của tôi (Clang / LLVM trên Linux) gặp lỗi sau:

recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
                   ^

Tôi đã thử tìm kiếm trên google nhưng vẫn không gặp may.

#include <limits.h> KHÔNG khắc phục được sự cố / lỗi.

Tôi cũng chính xác rằng giá trị của PATH_MAX là một int?


3
Vui lòng xem câu hỏi này: stackoverflow.com/questions/833291/…
Josh Brown,

18
Bạn có thể muốn char current_path[PATH_MAX];thay vì char *current_path[PATH_MAX];- bạn muốn một chuỗi hơn là một mảng con trỏ.
John Carter

Câu trả lời:


134

Của nó trong linux/limits.h.
#define PATH_MAX 4096 /* # chars in a path name including nul */

#include <linux/limits.h>

char current_path[PATH_MAX];

PATH_MAXcó một số sai sót như đã đề cập trong blog này (cảm ơn paulsm4)


23
Đây là một liên kết tốt về PATH_MAX ... và tại sao nó không đơn giản : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4 26/02/12

Chờ đã ... điều này có nghĩa là PATH_MAX là dành riêng cho linux và không phải là một phần của bất kỳ tiêu chuẩn nào?
Edward Falk

6
Bạn có thể nên sử dụng <limit.h>; <linux / limit.h> có vẻ không di động được.
Edward Falk

4
Lưu ý: PATH_MAX khác với NAME_MAX (và bài báo x-ref'd một phần dường như nhầm lẫn hai điều này, ít nhất là một phần). Lưu ý: POSIX <limits.h>cho biết: Định nghĩa của một trong các hằng số tượng trưng trong danh sách sau sẽ bị bỏ qua khỏi <limits.h>tiêu đề […] trong đó giá trị tương ứng bằng hoặc lớn hơn giá trị tối thiểu đã nêu, nhưng giá trị có thể thay đổi tùy theo tệp mà nó được áp dụng. Giá trị thực tế được hỗ trợ cho một tên đường dẫn cụ thể sẽ được cung cấp bởi hàm pathconf ().
Jonathan Leffler

1
Tên đường dẫn rất xấu, không an toàn và path_max là một lời nói dối và thậm chí không phải là một hằng số (nó có thể khác nhau trên các chức năng hệ điều hành khác nhau). Đó là một tính năng khủng khiếp và nên được thay thế càng sớm càng tốt.
Lothar

13

Hãy lưu ý rằng vẫn chưa rõ liệu PATH_MAXđịnh nghĩa độ dài tối đa có hay không có byte nul ở cuối. Nó có thể là cái này hoặc cái khác trên các hệ điều hành khác nhau. Nếu bạn không thể hoặc không muốn kiểm tra trường hợp đó trong quá trình biên dịch, sẽ an toàn hơn nếu bạn buộc giới hạn giả tạo PATH_MAX - 1. Cẩn tắc vô ưu. (Rõ ràng, bạn vẫn cần dự trữ ít nhất PATH_MAXbyte bộ nhớ để đệm chuỗi.)


4
> {PATH_MAX}Số byte tối đa trong tên đường dẫn, bao gồm cả ký tự null kết thúc. Từ POSIX '01.
muh karma

8
Lưu ý rằng POSIX 2008 đã giải quyết được sự nhầm lẫn - <limits.h>(Lý do): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 đã giải quyết sự mâu thuẫn trong tiêu chuẩn với định nghĩa tên đường dẫn và mô tả của {PATH_MAX}, cho phép các nhà phát triển ứng dụng phân bổ {PATH_MAX} hoặc {PATH_MAX} +1 byte. Sự mâu thuẫn đã được loại bỏ bằng cách sửa định nghĩa {PATH_MAX} để bao gồm ký tự rỗng. Với thay đổi này, các ứng dụng đã phân bổ byte {PATH_MAX} trước đó sẽ tiếp tục thành công.
Jonathan Leffler

1
Cũng lưu ý rằng bạn không nên sử dụng PATH_MAX - 1, nhưng PATH_MAX + 1. Bạn không cần phải làm như vậy nữa, nhưng bạn muốn thêm một byte cho '\0'.
Alexis Wilke

1
PATH_MAX là lý do tại sao mọi người nghĩ rằng windows rất tệ trong khi thực tế chỉ có lập trình viên mới sử dụng PATH_MAX. PATH_MAX thực sự ít nhất là 32k trên windows và hầu như bạn không bao giờ muốn khai báo PATH_MAX là 32k.
Lothar

7

Cách di động để làm điều đó là:

#define _POSIX_C_SOURCE 1
#include <limits.h>

Thông số: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


Và thậm chí điều đó vẫn chưa đủ. PATH_MAXkhông cần phải xác định: "Định nghĩa của một trong các hằng số ký hiệu trong danh sách sau sẽ bị bỏ qua khỏi <limits.h>tiêu đề trên các triển khai cụ thể trong đó giá trị tương ứng bằng hoặc lớn hơn giá trị tối thiểu đã nêu, nhưng giá trị có thể thay đổi tùy theo trên tệp mà nó được áp dụng. Giá trị thực tế được hỗ trợ cho một tên đường dẫn cụ thể sẽ được cung cấp bởi pathconf()hàm. " Do hệ thống tệp Linux hỗ trợ các giá trị khác nhau, có thể đó là vi phạm tiêu chuẩn POSIX cho Linux để xác định PATH_MAX.
Andrew Henle

1

Khi lập trình C đơn giản, tôi cũng gặp phải thử thách tương tự. Trên hệ thống Linux cụ thể của bạn, thư mục / usr / include chứa nhiều tệp tiêu đề ở đây dành riêng cho HĐH Linux.

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

Bạn sẽ thấy một số tiêu đề xác định PATH_MAX; tiếc là giá trị này được định nghĩa khác nhau trong các tiêu đề khác nhau. Đây là danh sách từ Ubuntu của tôi (tôi cũng đã xóa thủ công một số lần truy cập dương tính giả khỏi chương trình 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

Tiêu đề /linux/limits.h có số lượng lớn nhất và phải là tiêu đề xác thực nhất để bao gồm. Chiến lược thay thế là xác định tên riêng của bạn bằng một tên khác, chẳng hạn PATHLEN (4080 đủ dài cho hầu hết các tình huống thực tế). Điểm chính của tôi là học cách sử dụng find để tìm câu trả lời cho câu hỏi của bạn.


0

PATH_MAX là một giới hạn hệ thống. Có ba danh mục về giới hạn hệ thống tồn tại trong môi trường POSIX. Một trong những danh mục này là Giá trị biến đường dẫn . Giới hạn hệ thống phụ thuộc vào hệ thống tệp được xếp vào loại này. PATHMAX cũng là giá trị biến của tên đường dẫn. (vì vậy giá trị này có thể thay đổi từ hệ thống tệp sang hệ thống tệp.) Vì vậy, giới hạn PATHNAME có thể đạt được với các hàm pathconf () / fpathconf () POSIX. Cách này là cách di động để nhận giới hạn PATHNAME của hệ thống tệp đặc biệt. Mã ví dụ như sau:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.