Di manakah PATH_MAX didefinisikan di Linux?

112

File header mana yang harus saya panggil #includeagar dapat menggunakan PATH_MAX sebagai int untuk mengukur string?

Saya ingin bisa menyatakan:

char *current_path[PATH_MAX];

Tetapi ketika saya melakukannya kompiler saya (Clang / LLVM di Linux) mengeluarkan kesalahan berikut:

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

Saya mencoba melakukan pencarian google tetapi masih tidak berhasil.

#include <limits.h> TIDAK memperbaiki masalah / error.

Apakah saya juga benar bahwa nilai PATH_MAX adalah int?

haziz
sumber
3
Silakan lihat pertanyaan ini: stackoverflow.com/questions/833291/…
Josh Brown
18
Anda mungkin ingin char current_path[PATH_MAX];bukannya char *current_path[PATH_MAX];- Anda menginginkan string daripada array pointer.
John Carter
atau yang satu ini stackoverflow.com/questions/4267390/…
qdii

Jawaban:

134

Ini masuk linux/limits.h.
#define PATH_MAX 4096 /* # chars in a path name including nul */

#include <linux/limits.h>

char current_path[PATH_MAX];

PATH_MAXmemiliki beberapa kekurangan seperti yang disebutkan di blog ini (terima kasih paulsm4)

Shiplu Mokaddim
sumber
23
Berikut tautan bagus tentang PATH_MAX ... dan mengapa tidak : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4
Tunggu ... apakah ini berarti bahwa PATH_MAX khusus untuk linux dan bukan bagian dari standar apa pun?
Edward Falk
6
Anda mungkin harus menggunakan <batas.h>; <linux / limit.h> jelas terlihat tidak portabel.
Edward Falk
4
Hati-hati: PATH_MAX berbeda dari NAME_MAX (dan artikel x-ref'd sebagian tampaknya membingungkan keduanya, setidaknya sebagian). Catatan: POSIX <limits.h>mengatakan: Definisi salah satu konstanta simbolik dalam daftar berikut harus dihilangkan dari <limits.h>header […] di mana nilai yang sesuai sama atau lebih besar dari minimum yang dinyatakan, tetapi nilainya dapat bervariasi tergantung pada file untuk itu diterapkan. Nilai sebenarnya yang didukung untuk nama jalur tertentu harus disediakan oleh fungsi pathconf ().
Jonathan Leffler
1
Nama jalur sangat jahat, tidak aman dan path_max adalah kebohongan dan bahkan bukan sebuah konstanta (mungkin berbeda pada fungsi OS yang berbeda). Ini adalah fitur yang buruk dan harus diganti secepatnya.
Lothar
13

Sadarilah, bahwa masih belum jelas apakah PATH_MAXmendefinisikan panjang maksimum dengan atau tanpa byte nol trailing. Ini mungkin salah satu atau yang lain di sistem operasi yang berbeda. Jika Anda tidak dapat atau tidak ingin memeriksa kasus mana itu selama kompilasi, lebih aman untuk memaksakan batasan buatan PATH_MAX - 1. Lebih baik aman daripada menyesal. (Jelas, Anda masih perlu mencadangkan setidaknya PATH_MAXbyte memori untuk menyangga string.)

Kumashiro
sumber
4
> {PATH_MAX}Jumlah maksimum byte dalam nama jalur, termasuk karakter null yang mengakhiri. Dari POSIX '01.
muh karma
8
Perhatikan bahwa POSIX 2008 menyelesaikan kebingungan - <limits.h>(Dasar Pemikiran): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 mengatasi ketidakkonsistenan dalam standar dengan definisi nama jalur dan deskripsi {PATH_MAX}, memungkinkan pengembang aplikasi untuk mengalokasikan {PATH_MAX} atau {PATH_MAX} +1 byte. Ketidakkonsistenan telah dihapus dengan koreksi pada definisi {PATH_MAX} untuk menyertakan karakter null. Dengan perubahan ini, aplikasi yang sebelumnya mengalokasikan {PATH_MAX} byte akan terus berhasil.
Jonathan Leffler
1
Perhatikan juga bahwa Anda tidak boleh menggunakan PATH_MAX - 1, tetapi PATH_MAX + 1. Anda tidak perlu lagi, tetapi Anda ingin menambahkan satu byte untuk file '\0'.
Alexis Wilke
1
PATH_MAX adalah alasan mengapa orang menganggap windows menyebalkan padahal sebenarnya hanya programmer yang menggunakan PATH_MAX. PATH_MAX sebenarnya setidaknya 32k di windows dan Anda hampir tidak pernah ingin mendeklarasikan PATH_MAX menjadi 32k.
Lothar
7

Cara portabel untuk melakukannya adalah:

#define _POSIX_C_SOURCE 1
#include <limits.h>

Spesifikasi: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html

kemunculan
sumber
Dan itu pun tidak cukup. PATH_MAXtidak harus didefinisikan: "Definisi salah satu konstanta simbolik dalam daftar berikut harus dihilangkan dari <limits.h>tajuk pada implementasi tertentu yang nilainya sama atau lebih besar dari minimum yang dinyatakan, tetapi nilainya dapat bervariasi bergantung pada file yang diterapkan. Nilai sebenarnya yang didukung untuk nama jalur tertentu harus disediakan oleh pathconf()fungsi. " Mengingat sistem file Linux mendukung nilai yang berbeda, mungkin ini merupakan pelanggaran terhadap standar POSIX yang didefinisikan oleh Linux PATH_MAX.
Andrew Henle
1

Saat melakukan pemrograman C sederhana, saya menghadapi tantangan yang sama. Pada sistem Linux Anda, / usr / include direktori berisi banyak, di sini file header khusus untuk OS Linux.

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

Anda akan melihat beberapa header yang mendefinisikan PATH_MAX; sayangnya nilai ini didefinisikan secara berbeda di header yang berbeda. Berikut ini daftar dari Ubuntu saya (saya juga secara manual menghapus beberapa klik positif palsu dari program 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

Header /linux/limits.h memiliki angka terbesar dan harus yang paling otentik untuk disertakan. Strategi alternatif adalah mendefinisikan milik Anda sendiri dengan nama yang berbeda, katakanlah PATHLEN (4080 cukup panjang untuk kebanyakan situasi praktis). Poin utama saya adalah belajar menggunakan find untuk mencari jawaban atas pertanyaan Anda.

Kemin Zhou
sumber
0

PATH_MAX adalah batas sistem. Ada tiga kategori tentang batasan sistem yang ada di lingkungan POSIX. Salah satu kategori ini adalah Pathname Variable Values . Batasan sistem yang bergantung pada sistem file termasuk dalam kategori ini. PATHMAX juga merupakan nilai variabel pathname. (sehingga nilai ini dapat berubah dari sistem file ke sistem file.) Jadi, batas PATHNAME dapat diperoleh dengan fungsi POSIX pathconf () / fpathconf () . Cara ini merupakan cara portabel untuk mendapatkan batasan PATHNAME dari sistem file tertentu. Contoh kode seperti di bawah ini:

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;
}
pengguna3104363
sumber