PATH_MAX Linux'ta nerede tanımlanır?


112

#includeBir dizeyi boyutlandırmak için bir int olarak PATH_MAX'ı kullanabilmek için hangi başlık dosyasını çağırmalıyım?

Beyan edebilmek istiyorum:

char *current_path[PATH_MAX];

Ancak bunu yaptığımda derleyicim (Linux'ta Clang / LLVM) aşağıdaki hatayı veriyor:

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

Google araması yapmayı denedim ama yine de şansım yok.

#include <limits.h> Problemi / hatayı DÜZELTMEZ.

PATH_MAX değerinin int olduğunu da doğru muyum?


3
Lütfen şu soruya bakın: stackoverflow.com/questions/833291/…
Josh Brown

18
Muhtemelen char current_path[PATH_MAX];bunun yerine char *current_path[PATH_MAX];- bir dizi işaretçi yerine bir dizge istiyorsunuz.
John Carter

Yanıtlar:


134

İçinde linux/limits.h.
#define PATH_MAX 4096 /* # chars in a path name including nul */

#include <linux/limits.h>

char current_path[PATH_MAX];

PATH_MAXbu blogda belirtildiği gibi bazı kusurları var (teşekkürler paulsm4)


23
İşte PATH_MAX hakkında iyi bir bağlantı ... ve neden basitçe olmadığı : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4

Bekle ... Bu, PATH_MAX'in linux'a özgü olduğu ve herhangi bir standardın parçası olmadığı anlamına mı geliyor?
Edward Falk

6
Muhtemelen <limits.h> kullanmalısınız; <linux / limits.h> açıkça taşınabilir değil gibi görünüyor.
Edward Falk

4
Dikkat: PATH_MAX, NAME_MAX'tan farklıdır (ve x-ref'lenmiş makale kısmen bu ikisini, en azından kısmen karıştırıyor gibi görünüyor). Not: POSIX <limits.h>şöyle diyor: Aşağıdaki listede yer alan sembolik sabitlerden birinin tanımı <limits.h>, karşılık gelen değerin belirtilen minimum değere eşit veya bundan büyük olduğu, ancak değerin dosyaya bağlı olarak değişebileceği durumlarda […] başlığından çıkarılmalıdır. uygulandığı yere. Belirli bir yol adı için desteklenen gerçek değer, pathconf () işlevi tarafından sağlanacaktır.
Jonathan Leffler

1
Yol adları çok kötüdür, güvensizdir ve path_max bir yalandır ve sabit bile değildir (farklı işletim sistemi işlevlerinde farklı olabilir). Bu korkunç bir özellik ve en kısa zamanda değiştirilmelidir.
Lothar

13

PATH_MAXSonunda boş bayt olan veya olmayan bir maksimum uzunluğu tanımlayıp tanımlamadığının hala belirsiz olduğunu unutmayın . Farklı işletim sistemlerinde biri veya diğeri olabilir. Derleme sırasında hangi durumun olduğunu kontrol edemiyor ya da kontrol etmek istemiyorsanız, yapay sınırı zorlamak daha güvenlidir PATH_MAX - 1. Eşeği sağlam kazığa bağlamak. (Açıktır ki, PATH_MAXdizeyi arabelleğe almak için en az bayt bellek ayırmanız gerekir .)


4
> {PATH_MAX}Sonlandırıcı boş karakter dahil, bir yol adındaki maksimum bayt sayısı. POSIX '01'den.
muh karma

8
POSIX 2008'in karışıklığı çözdüğünü unutmayın - <limits.h>(Gerekçe): {PATH_MAX} IEEE PASC Yorumlama 1003.1 # 15, standartta yol adı tanımı ve {PATH_MAX} açıklaması ile tutarsızlığı ele alarak uygulama geliştiricilerin {PATH_MAX} veya {PATH_MAX} +1 bayt. Tutarsızlık, boş karakteri içerecek şekilde {PATH_MAX} tanımında düzeltme yapılarak kaldırıldı. Bu değişiklikle, önceden {PATH_MAX} bayt ayıran uygulamalar başarılı olmaya devam edecek.
Jonathan Leffler

1
PATH_MAX - 1Ama kullanmamanız gerektiğini de unutmayın PATH_MAX + 1. Artık zorunda değilsiniz, ancak için bir bayt eklemek istiyorsunuz '\0'.
Alexis Wilke

1
PATH_MAX, insanların pencerelerin berbat olduğunu düşünmelerinin nedenidir, oysa aslında PATH_MAX emmek kullanan yalnızca programcıdır. PATH_MAX, pencerelerde gerçekten en az 32k'dir ve neredeyse hiçbir zaman PATH_MAX'ın 32k olduğunu bildirmek istemezsiniz.
Lothar

7

Bunu yapmanın taşınabilir yolu:

#define _POSIX_C_SOURCE 1
#include <limits.h>

Teknik Özellikler: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


Ve bu bile yeterli değil. PATH_MAXtanımlanması gerekmez: "Aşağıdaki listede yer alan sembolik sabitlerden birinin tanımı , karşılık gelen değerin belirtilen minimum değere eşit veya daha büyük olduğu, ancak değerin bağlı olarak değişebileceği özel uygulamalarda başlıktan çıkarılacaktır . <limits.h>belirli bir yol adı için desteklenen gerçek değer pathconf()işlev tarafından sağlanacaktır . " Linux dosya sistemlerinin farklı değerleri desteklediği düşünüldüğünde, bu muhtemelen Linux'un tanımlaması için POSIX standardının ihlalidir PATH_MAX.
Andrew Henle

1

Basit C programlaması yaparken aynı zorlukla karşılaştım. Belirli Linux sisteminizde, / usr / include dizini burada bir Linux işletim sistemine özgü birçok başlık dosyası içerir.

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

PATH_MAX'ı tanımlayan birkaç başlık görmelisiniz; ne yazık ki bu değer farklı başlıklarda farklı şekilde tanımlandı. İşte Ubuntu'mdan bir liste (ayrıca grep programından bazı yanlış pozitif isabetleri manuel olarak kaldırdım).

./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 başlığı en büyük sayıya sahipti ve eklenecek en özgün başlık olmalıdır. Alternatif strateji, kendi stratejinizi farklı bir isimle tanımlamaktır, örneğin PATHLEN (4080, çoğu pratik durum için yeterince uzun). Asıl amacım, sorunuzun yanıtlarını aramak için bul özelliğini kullanmayı öğrenmek.


0

PATH_MAX bir sistem sınırıdır. POSIX ortamında sistem sınırları ile ilgili üç kategori bulunmaktadır. Bu kategorilerden biri Yol Adı Değişken Değerleridir . Dosya sistemine bağlı sistem sınırları bu kategoriye girer. PATHMAX ayrıca yol adı değişken değeridir. (böylece bu değer dosya sisteminden dosya sistemine değişebilir.) Dolayısıyla, PATHNAME sınırı pathconf () / fpathconf () POSIX fonksiyonları ile elde edilebilir. Bu, belirli bir dosya sisteminin PATHNAME limitini elde etmenin taşınabilir bir yoludur. Örnek kod aşağıdaki gibidir:

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.