PATH_MAX লিনাক্সে সংজ্ঞায়িত কোথায়?


112

#includeস্ট্রিং আকারের জন্য PATH_MAX ব্যবহার করতে সক্ষম হতে আমি কোন শিরোলেখ ফাইলটিতে অনুরোধ করব ?

আমি ঘোষণা করতে সক্ষম হতে চাই:

char *current_path[PATH_MAX];

তবে যখন আমি এটি করি তখন আমার সংকলক (লিনাক্সে কলং / এলএলভিএম) নিম্নলিখিত ত্রুটিটি জারি করে:

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

আমি গুগল অনুসন্ধান করার চেষ্টা করেছি কিন্তু এখনও ভাগ্য হয়নি।

#include <limits.h> সমস্যা / ত্রুটি ঠিক করে না।

আমি কি PATH_MAX এর মান একটি অন্তর্নিহিত ঠিক করছি?


3
দয়া করে এই প্রশ্নটি দেখুন: stackoverflow.com/questions/833291/…
জোশ ব্রাউন

18
আপনি সম্ভবত char current_path[PATH_MAX];পরিবর্তে চান char *current_path[PATH_MAX];- আপনি পয়েন্টার অ্যারের চেয়ে একটি স্ট্রিং চান।
জন কার্টার

অথবা এই এক stackoverflow.com/questions/4267390/...
qdii

উত্তর:


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এই ব্লগে উল্লিখিত কিছু ত্রুটি আছে (ধন্যবাদ পলস্ম 4)


23
এখানে PATH_MAX সম্পর্কে একটি ভাল লিঙ্ক ... এবং কেন এটি সহজভাবে হয় না : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4

অপেক্ষা করুন ... এর অর্থ কি PATH_MAX লিনাক্স-নির্দিষ্ট এবং কোনও মানের অংশ নয়?
এডওয়ার্ড ফাল

6
আপনার সম্ভবত <সীমাবদ্ধতা> ব্যবহার করা উচিত; <লিনাক্স / সীমাবদ্ধতা> স্বতঃহীন-বহনযোগ্য looks
এডওয়ার্ড ফ্যাল্ক

4
সাবধান: PATH_MAX NAME_MAX থেকে আলাদা (এবং অংশে এক্স-রেফ-নিবন্ধ নিখুঁতভাবে এই দুটি বিভ্রান্ত বলে মনে হচ্ছে)। দ্রষ্টব্য: পসিক্স <limits.h>বলেছেন: নিম্নলিখিত তালিকার একটি প্রতীকী ধ্রুবকের একটি সংজ্ঞা <limits.h>শিরোনাম থেকে বাদ দেওয়া হবে […] যেখানে সংশ্লিষ্ট মানটি বর্ণিত সর্বনিম্নের চেয়ে সমান বা তার বেশি, তবে যেখানে ফাইলের উপর নির্ভর করে মান পৃথক হতে পারে যা এটি প্রয়োগ করা হয়। নির্দিষ্ট পাথনামের জন্য সমর্থিত প্রকৃত মানটি পাথকোনফ () ফাংশন দ্বারা সরবরাহ করা হবে।
জনাথন লেফলার

1
পাথের নামগুলি খুব খারাপ, অনিরাপদ এবং পথ_ম্যাক্স একটি মিথ্যা এবং এমনকি ধ্রুবকও নয় (এটি বিভিন্ন ওএস কার্যক্রমে ভিন্ন হতে পারে)। এটি একটি ভয়ানক বৈশিষ্ট্য এবং এএসএপি প্রতিস্থাপন করা উচিত।
লোথার

13

সচেতন থাকুন, এটি PATH_MAXঅনুসরণযোগ্য নুল বাইটের সাথে বা ছাড়াই সর্বাধিক দৈর্ঘ্য নির্ধারণ করে কিনা তা এখনও অস্পষ্ট । এটি বিভিন্ন অপারেটিং সিস্টেমে এক বা অন্য হতে পারে। সংকলনের সময় আপনি যদি এটিটি দেখতে চান বা না করতে চান তবে এটি কৃত্রিম সীমাতে বাধ্য করা নিরাপদ PATH_MAX - 1। দুঃখিত চেয়ে ভাল নিরাপদ. (স্পষ্টতই, PATH_MAXস্ট্রিং বাফার করার জন্য আপনার কমপক্ষে কমপক্ষে মেমরি সংরক্ষণ করতে হবে))


4
> {PATH_MAX}নথ চরিত্রের অবসান সহ একটি পথের সর্বাধিক সংখ্যক বাইট। POSIX '01 থেকে।
মুহ কর্মফল

8
নোট করুন যে POSIX 2008 বিভ্রান্তির সমাধান করেছে - <limits.h>(যুক্তি): name PATH_MAX} আইইইই পিএএসসি ব্যাখ্যার 1003.1 # 15 পথের নাম এবং {PATH_MAX the এর বর্ণনার সাথে মানের অসঙ্গতিটিকে সম্বোধন করেছে, অ্যাপ্লিকেশন বিকাশকারীদের either PATH_MAX} বা বরাদ্দ দেওয়ার অনুমতি দেয় AT PATH_MAX} +1 বাইট। নাল অক্ষর অন্তর্ভুক্ত করার জন্য {PATH_MAX} সংজ্ঞা সংশোধন করে অসঙ্গতি অপসারণ করা হয়েছে। এই পরিবর্তনের সাথে, যে অ্যাপ্লিকেশনগুলি আগে allocated PATH_MAX} বাইটগুলি বরাদ্দ করেছিল তারা সফল হতে থাকবে।
জনাথন লেফলার

1
আপনার ব্যবহার করা উচিত নয় তাও নোট করুন PATH_MAX - 1, তবে PATH_MAX + 1। আপনার আর দরকার নেই তবে আপনি এর জন্য একটি বাইট যুক্ত করতে চান '\0'
অ্যালেক্সিস উইলক

1
PATH_MAX এ কারণেই লোকেরা মনে করে যে উইন্ডোগুলি চুষে বেড়ায় এবং আসলে এটি কেবল প্রোগ্রামার যারা PATH_MAX স্তন্যপান ব্যবহার করে। PATH_MAX উইন্ডোজটিতে কমপক্ষে 32 কিলোমিটার এবং আপনি প্যাথ_ম্যাক্স প্রায় 32k হিসাবে ঘোষণা করতে চান না।
লোথার

7

এটি করার পোর্টেবল উপায় হ'ল:

#define _POSIX_C_SOURCE 1
#include <limits.h>

স্পেস: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


এবং এমনকি এটি যথেষ্ট নয়। PATH_MAXসংজ্ঞায়িত করতে হবে না: "নিম্নলিখিত তালিকার একটি প্রতীকী ধ্রুবকের একটি সংজ্ঞা নির্দিষ্ট প্রয়োগের ক্ষেত্রে শিরোনাম থেকে বাদ দেওয়া হবে<limits.h> যেখানে সংশ্লিষ্ট মানটি বর্ণিত সর্বনিম্নের চেয়ে সমান বা তার বেশি হয় তবে যেখানে মান নির্ভর করে তারতম্য হতে পারে যে ফাইলটিতে এটি প্রয়োগ করা হয়েছে সেটিতে। নির্দিষ্ট পথের নামের জন্য সমর্থিত আসল মানটি pathconf()ফাংশন দ্বারা সরবরাহ করা হবে । " প্রদত্ত লিনাক্স ফাইল সিস্টেমগুলি বিভিন্ন মানকে সমর্থন করে, সম্ভবত এটি লিনাক্সের সংজ্ঞা দেওয়ার জন্য POSIX মানের লঙ্ঘন PATH_MAX
অ্যান্ড্রু হেনেল

1

সাধারণ সি প্রোগ্রামিং করার সময় আমি একই চ্যালেঞ্জের মুখোমুখি হয়েছিলাম। আপনার নির্দিষ্ট লিনাক্স সিস্টেমে / usr / অন্তর্ভুক্ত ডিরেক্টরিতে অনেকগুলি রয়েছে, এখানে একটি লিনাক্স ওএসের জন্য নির্দিষ্ট হেডার ফাইল রয়েছে।

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

আপনার বেশ কয়েকটি শিরোনাম PATH_MAX সংজ্ঞায়িত করা উচিত; দুর্ভাগ্যক্রমে এই মানটি বিভিন্ন শিরোনামে আলাদাভাবে সংজ্ঞায়িত হয়েছিল। আমার উবুন্টু থেকে এখানে একটি তালিকা রয়েছে (আমি গ্রেপ প্রোগ্রাম থেকে কিছু মিথ্যা ইতিবাচক হিট ম্যানুয়ালিও মুছে ফেলেছি)।

./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

হেডার / লিনিক্স / লিমিটস.এ সবচেয়ে বেশি নম্বর ছিল এবং এটি অন্তর্ভুক্ত করার জন্য সবচেয়ে খাঁটি হওয়া উচিত। বিকল্প কৌশলটি আপনার নিজের নামের একটি আলাদা নামের সাথে সংজ্ঞায়িত করা, প্যাথলেন বলুন (4080 বেশিরভাগ ব্যবহারিক পরিস্থিতির জন্য যথেষ্ট দীর্ঘ)। আমার মূল বক্তব্যটি আপনার প্রশ্নের উত্তর খুঁজতে সন্ধানের ব্যবহারটি শিখতে হবে।


0

PATH_MAX একটি সিস্টেম সীমা। পসিক্স পরিবেশে সিস্টেম সীমা সম্পর্কে তিনটি বিভাগ রয়েছে। এই শ্রেণীর এক পথনাম চলক মানগুলি । সিস্টেম সীমা যা ফাইল সিস্টেমের উপর নির্ভর করে এই বিভাগে আসে। PATHMAX হ'ল পথের পরিবর্তনশীল মান। (সুতরাং এই মানটি ফাইল সিস্টেম থেকে ফাইল সিস্টেমে পরিবর্তিত হতে পারে)) সুতরাং, প্যাথকনফ () / fpathconf () POSIX ফাংশন দিয়ে PATHNAME সীমা পাওয়া যায় । এই উপায়টি PATHNAME প্রশংসনীয় ফাইল সিস্টেমের সীমা পাওয়ার পক্ষে port উদাহরণ কোড নীচের মত:

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.