uid_t类型是签名还是未签名?
我知道标准没有说明uid_t
或gid_t
的签名。
不一致性:
页面http://www.gnu.org/software/libc/manual/html_node/Reading-Persona.html说:
在GNU C库中,这是unsigned int的别名。
但是man setreuid
说:
为实际或有效用户ID提供值-1会强制系统保持该ID不变。
问题:
-
那么,在GNU库中
uid_t
签名或未签名? -
如果
uid_t
和gid_t
无符号(-1
将转换为0xFFFFFFFF
),如何提供-1
?
uid_t
(在某些typedef / __U32_TYPE
之后)定义为__U32_TYPE
,它被定义为unsigned int
(在我的Gentoo Linux系统上)。
但是,仅仅因为-1
具有特殊含义,并不意味着UID仅限于符合signed int
的数字。 它只是意味着最高值(即(unsigned int)-1
)不是有效的UID。 setreuid
的代码可能使用该setreuid
( (signed int)ruid
)的反向forms来干净地与-1
进行比较,尽管它接受了uid_t
。
POSIX明确表示pid_t
是一个有符号整数类型,用于表示进程和进程组ID。
它表示ino_t
是一个用于文件序列号的无符号整数类型。
对于uid_t
和gid_t
,它表示该类型是用于用户ID和组IDS的整数类型(不提及有符号或无符号)。
因此,该标准明确规定uid_t
和gid_t
的类型可以根据平台进行签名或不签名。 假设出现这种不确定性是非常合理的,因为实际实现使用了有符号和无符号类型,并且标准的设计不会使现有实现无效。