uid_t类型是签名还是未签名?

时间:2014-01-26 22:26:22

标签: c uid

我知道该标准没有说明uid_tgid_t的签名。

不一致性:

Page http://www.gnu.org/software/libc/manual/html_node/Reading-Persona.html说:

  

在GNU C库中,这是 unsigned int 的别名。

man setreuid说:

  

为实际或有效用户ID提供值 -1 会强制系统保持该ID不变。

问题:

  1. 那么,GNU库中uid_t是否已签名或未签名?

  2. 如果-1uid_t未签名(gid_t将转换为-1),如何提供0xFFFFFFFF

2 个答案:

答案 0 :(得分:9)

POSIX明确表示pid_t是一个有符号整数类型,用于表示进程和进程组ID。

它表示ino_t是用于文件序列号的无符号整数类型。

对于uid_tgid_t,它表示该类型是用于用户ID和组IDS的整数类型(不提及有符号或无符号)。

因此,该标准明确规定uid_tgid_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