Jawaban:
Anda harus melihat ke dalam <limits.h>(atau salah satu file itu termasuk, misalnya, sys/syslimits.hpada OS X) untuk #definedari UID_MAX.
Sebagian besar sistem operasi terbaru (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) dapat menangani hingga dua miliar ( 2^31-2), jadi saya akan berasumsi dan membuat solusi untuk sistem yang lebih tidak jelas yang tidak 't.
login.defsmenunjukkan bahwa dalam konteks itu, UID_MAXhanya mengontrol uid tertinggi yang secara otomatis akan ditugaskan untuk pengguna baru dibuat dengan useradd.
glibc memberikan definisi untuk semua tipe sistem tersebut.
Anda dapat memeriksa /usr/include/bits/typesizes.h:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Selanjutnya Anda melihat /usr/include/bits/types.h:
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
Ini memungkinkan Anda menemukan tipe C. Karena Anda memerlukan ukuran dalam byte, opsi terbaik Anda adalah menguraikan nama typedef sesuai dengan spesifikasi di types.h:
We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
variants of each of the following integer types on this machine.
16 -- "natural" 16-bit type (always short)
32 -- "natural" 32-bit type (always int)
64 -- "natural" 64-bit type (long or long long)
LONG32 -- 32-bit type, traditionally long
QUAD -- 64-bit type, always long long
WORD -- natural type of __WORDSIZE bits (int or long)
LONGWORD -- type of __WORDSIZE bits, traditionally long
Jadi, ini satu kalimat:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
Di sini Uberarti unsigned(ini bisa juga Suntuk signed) dan 32merupakan ukuran (lihat di daftar di atas; saya pikir, sebagian besar waktu Anda dapat mengasumsikan bahwa itu sudah ukuran dalam byte, tetapi jika Anda ingin skrip Anda sepenuhnya portabel itu mungkin lebih baik untuk casemengaktifkan nilai ini).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.hatau sebagai alternatif:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
Itu pertanyaan yang menarik. Saya akan terkejut jika ada metode standar dan portabel untuk menentukan ini.
Saya tidak memiliki kotak Linux yang berguna, tetapi idperintah pada FreeBSD 8.0 kembali ke nol:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Saya yakin ini adalah perilaku yang tidak terdefinisi, tetapi saya berani bertaruh bahwa sebagian besar versi idakan membungkus ke nol dengan 65'536(jika 16-bit UID) dan 4'294'967'296atau kesalahan keluar jika Anda melampaui batas sistem.
Dalam tautan ini , pertanyaan diajukan dan responden menggunakan metode percobaan & kesalahan untuk menentukan sistem yang dimaksud menggunakan int panjang yang ditandatangani, meninggalkan 31 bit untuk menyimpan nilai, dengan maksimal 2,147.483.647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX. Misalnya, alat darishadow-utilspenggunaan(uid_t)-1untuk mengetahui nilai maksimal untuk UID.