PATH_MAX को लिनक्स में कहाँ परिभाषित किया गया है?


112

#includeकिसी स्ट्रिंग को साइज़ करने के लिए PATH_MAX का उपयोग करने में सक्षम होने के लिए मुझे कौन सी हेडर फ़ाइल लेनी चाहिए ?

मैं घोषणा करने में सक्षम होना चाहता हूं:

char *current_path[PATH_MAX];

लेकिन जब मैं ऐसा करता हूं तो मेरा कंपाइलर (लिनक्स पर 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/…
जोश ब्राउन

18
आप शायद char current_path[PATH_MAX];इसके बजाय चाहते हैं char *current_path[PATH_MAX];- आप बिंदुओं की एक सरणी के बजाय एक स्ट्रिंग चाहते हैं।
जॉन कार्टर

जवाबों:


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इस ब्लॉग में उल्लिखित कुछ दोष हैं (धन्यवाद pulsm4)


23
यहाँ PATH_MAX के बारे में एक अच्छी कड़ी है ... और यह बस क्यों नहीं है : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4

प्रतीक्षा करें ... क्या इसका मतलब यह है कि PATH_MAX विशिष्ट है और किसी भी मानक का हिस्सा नहीं है?
एडवर्ड फल्क

6
आपको संभवतः <limit.h> का उपयोग करना चाहिए; <linux / limit.h> विशिष्ट गैर-पोर्टेबल लगता है।
एडवर्ड फल्क

4
खबरदार: PATH_MAX NAME_MAX से अलग है (और भाग में x-ref'd लेख इन दोनों को भ्रमित करने के लिए लगता है, कम से कम भाग में)। नोट: POSIX <limits.h>कहती है: निम्नलिखित सूची में प्रतीकात्मक स्थिरांक में से एक की परिभाषा <limits.h>हेडर से हटा दी जाएगी […] जहां संबंधित मान न्यूनतम बताए गए के बराबर या उससे अधिक है, लेकिन फ़ाइल के आधार पर मूल्य भिन्न हो सकता है जिस पर इसे लागू किया जाता है। एक विशिष्ट पथनाम के लिए समर्थित वास्तविक मान pathconf () फ़ंक्शन द्वारा प्रदान किया जाएगा।
जोनाथन लेफ्लर 4

1
Pathnames बहुत दुष्ट हैं, असुरक्षित हैं और path_max एक झूठ है और एक स्थिर भी नहीं है (यह अलग-अलग OS पर भिन्न हो सकता है)। यह एक भयानक विशेषता है और इसे ASAP से बदला जाना चाहिए।
लोथर

13

ज्ञात हो, कि यह अभी भी स्पष्ट नहीं है कि PATH_MAXएक अनुगामी नल बाइट के साथ या उसके बिना अधिकतम लंबाई को परिभाषित करता है। यह अलग-अलग ऑपरेटिंग सिस्टम पर एक या दूसरे हो सकते हैं। यदि आप संकलन के दौरान यह देखना नहीं चाहते हैं कि यह किस मामले में है, तो यह कृत्रिम सीमा लागू करने के लिए सुरक्षित है PATH_MAX - 1। माफी से अधिक सुरक्षित। (जाहिर है, आपको अभी भी PATH_MAXस्ट्रिंग को बफर करने के लिए कम से कम बाइट्स मेमोरी को आरक्षित करने की आवश्यकता है ।)


4
> {PATH_MAX}समाप्त होने वाले अशक्त चरित्र सहित एक पाथनाम में बाइट्स की अधिकतम संख्या। POSIX '01 से।
मुह कर्म

8
ध्यान दें कि POSIX 2008 ने भ्रम को हल किया - <limits.h>(तर्क): {PATH_MAX} IEEE PASC व्याख्या 1003.1 # 15 ने पथ नाम की परिभाषा और {PATH_MAX} के वर्णन के साथ मानक में विसंगति को संबोधित किया, जिससे एप्लिकेशन डेवलपर्स को {PATH_MAX} आवंटित करने की अनुमति मिली। {PATH_MAX} +1 बाइट्स। अशक्त चरित्र को शामिल करने के लिए {PATH_MAX} परिभाषा में सुधार के द्वारा असंगतता को हटा दिया गया है। इस परिवर्तन के साथ, पहले से आवंटित {PATH_MAX} बाइट्स वाले अनुप्रयोग सफल होते रहेंगे।
जोनाथन लेफ़्लर 4

1
ध्यान दें कि आपको उपयोग नहीं करना चाहिए PATH_MAX - 1, लेकिन PATH_MAX + 1। आपको अब और नहीं करना है, लेकिन आप इसके लिए एक बाइट जोड़ना चाहते हैं '\0'
एलेक्सिस विलके

1
PATH_MAX यही कारण है कि लोगों को लगता है कि विंडोज़ बेकार है जबकि वास्तव में यह केवल प्रोग्रामर है जो PATH_MAX का उपयोग करते हैं। PATH_MAX खिड़कियों पर वास्तव में कम से कम 32k है और आप वास्तव में लगभग कभी नहीं चाहते हैं कि PATH_MAX 32k हो।
लोथार

7

यह करने का पोर्टेबल तरीका है:

#define _POSIX_C_SOURCE 1
#include <limits.h>

विशेष: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.b.html


और यहां तक ​​कि यह पर्याप्त नहीं है। PATH_MAXसे परिभाषित करने की जरूरत नहीं है: "निम्न सूची में प्रतीकात्मक स्थिरांक में से एक की एक परिभाषा लोप हो जाएगा से <limits.h>विशिष्ट कार्यान्वयन पर हैडर जहां इसी मूल्य के बराबर है या बताए न्यूनतम से अधिक है, लेकिन आधार पर जहां मूल्य भिन्न हो सकते हैं जिस फ़ाइल पर इसे लागू किया गया है, वह एक विशिष्ट पथनाम के लिए समर्थित वास्तविक मान pathconf()फ़ंक्शन द्वारा प्रदान किया जाएगा । " यह देखते हुए कि लिनक्स फाइल सिस्टम विभिन्न मूल्यों का समर्थन करता है, यह संभवतः लिनक्स को परिभाषित करने के लिए POSIX मानक का उल्लंघन है PATH_MAX
एंड्रयू हेनले

1

सरल सी प्रोग्रामिंग करते समय, मुझे उसी चुनौती का सामना करना पड़ा। आपके विशेष लिनक्स सिस्टम, / usr / में डायरेक्टरी शामिल है जिसमें कई हैं, यहां लिनक्स ओएस के लिए विशिष्ट हेडर फाइलें हैं।

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

हेडर / क्लिनक्स / क्लिट.ह में सबसे बड़ी संख्या थी और इसमें शामिल करने के लिए सबसे प्रामाणिक होना चाहिए। वैकल्पिक रणनीति अपने खुद के एक अलग नाम के साथ परिभाषित करने के लिए है, कहते हैं PATHLEN (सबसे व्यावहारिक स्थितियों के लिए 4080 काफी लंबा है)। मेरा मुख्य बिंदु अपने प्रश्न के उत्तर की तलाश के लिए खोज का उपयोग करना सीखना है।


0

PATH_MAX एक सिस्टम सीमा है। POSIX वातावरण में सिस्टम सीमा के बारे में तीन श्रेणियां मौजूद हैं। इन श्रेणियों में से एक Pathname Variable Values ​​है । सिस्टम सीमाएँ जो फ़ाइल सिस्टम पर निर्भर होती हैं, इस श्रेणी में आती हैं। पैथमैक्स पैथनेम वैरिएबल वैल्यू भी है। (इसलिए यह मान फ़ाइल सिस्टम से फ़ाइल सिस्टम में बदल सकता है।) इसलिए, पाथनाम सीमा को पाथकोनफ़ () / 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.