Jawaban:
Anda harus melihat ke dalam <limits.h>
(atau salah satu file itu termasuk, misalnya, sys/syslimits.h
pada OS X) untuk #define
dari 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.defs
menunjukkan bahwa dalam konteks itu, UID_MAX
hanya 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 U
berarti unsigned
(ini bisa juga S
untuk signed
) dan 32
merupakan 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 case
mengaktifkan nilai ini).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
atau 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 id
perintah 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 id
akan membungkus ke nol dengan 65'536
(jika 16-bit UID) dan 4'294'967'296
atau 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-utils
penggunaan(uid_t)-1
untuk mengetahui nilai maksimal untuk UID.