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