Solusi 1:
Anda harus melihat <limits.h>
(atau salah satu file yang disertakan, mis., sys/syslimits.h
pada OS X) untuk #define
dari UID_MAX
.
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 itu dan membuat solusi untuk sistem yang lebih tidak jelas yang tidak.
Solusi 2:
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 mengetahui tipe C. Karena Anda memerlukan ukuran dalam byte, pilihan terbaik Anda adalah mem-parsing 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
(bisa juga S
untuk signed
) dan 32
adalah ukurannya (lihat di daftar di atas; saya pikir, sebagian besar waktu Anda dapat berasumsi bahwa itu sudah berukuran dalam byte, tetapi jika Anda ingin skrip Anda sepenuhnya portabel, mungkin lebih baik melakukannya case
aktifkan nilai ini).
Solusi 3:
Di tautan ini pertanyaan diajukan dan responden menggunakan metode coba-coba untuk menentukan sistem yang dimaksud menggunakan long int yang ditandatangani, menyisakan 31 bit untuk menyimpan nilai, dengan maksimal 2.147.483.647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Solusi 4:
Itu pertanyaan yang menarik. Saya akan terkejut jika ada metode standar dan portabel untuk menentukan ini.
Saya tidak memiliki kotak Linux, tetapi id
perintah pada FreeBSD 8.0 membungkus kembali ke nol:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Saya yakin ini adalah perilaku yang tidak ditentukan, tetapi saya berani bertaruh bahwa sebagian besar versi id
akan membungkus menjadi nol dengan 65'536
(jika UID 16-bit) dan 4'294'967'296
atau kesalahan jika Anda melampaui batas sistem.