Câu trả lời:
Bạn sẽ cần phải nhìn vào <limits.h>
(hoặc một trong các tập tin nó bao gồm, ví dụ, sys/syslimits.h
trên OS X) cho #define
các UID_MAX
.
Hầu hết các hệ điều hành gần đây (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) có thể xử lý tới hai tỷ ( 2^31-2
), vì vậy tôi sẽ giả định điều đó và giải quyết cho các hệ thống khó hiểu hơn 't.
login.defs
thấy rằng trong bối cảnh đó, UID_MAX
chỉ kiểm soát uid cao nhất mà sẽ tự động được gán cho người dùng mới tạo ra với useradd
.
glibc cung cấp định nghĩa cho tất cả các loại hệ thống.
Bạn có thể kiểm tra /usr/include/bits/typesizes.h
:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Tiếp theo bạn nhìn vào /usr/include/bits/types.h
:
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
Điều này cho phép bạn tìm ra loại C. Vì bạn cần kích thước theo byte, tùy chọn tốt nhất của bạn là phân tích tên typedef theo đặc tả trong 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
Vì vậy, đây là một lót:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
Ở đây U
có nghĩa là unsigned
(cái này cũng có thể S
dùng signed
) và 32
là kích thước (tìm nó trong danh sách ở trên; tôi nghĩ, hầu hết thời gian bạn có thể cho rằng đó đã có kích thước theo byte, nhưng nếu bạn muốn tập lệnh của mình có thể di chuyển hoàn toàn có thể tốt hơn để làm case
chuyển đổi trên giá trị này).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
hoặc cách khác:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
Đó là một câu hỏi thú vị. Tôi sẽ ngạc nhiên nếu có một phương pháp di động tiêu chuẩn để xác định điều này.
Tôi không có hộp Linux tiện dụng, nhưng id
lệnh trên FreeBSD 8.0 kết thúc bằng 0:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Tôi chắc chắn đây là hành vi không xác định, nhưng tôi muốn rằng hầu hết các phiên bản id
sẽ kết thúc bằng 0 65'536
(nếu UID 16 bit) và 4'294'967'296
lỗi nếu bạn vượt quá giới hạn hệ thống.
Trong liên kết này , câu hỏi được hỏi và người trả lời sử dụng phương pháp dùng thử & lỗi để xác định hệ thống được đề cập sử dụng một int dài đã ký, để lại 31 bit để lưu trữ giá trị, với tối đa là 2.147.483.647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX
. Ví dụ: các công cụ từshadow-utils
việc sử dụng(uid_t)-1
để tìm ra giá trị tối đa cho UID.