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

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

不一致性:

页面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. 如果uid_tgid_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_tgid_t ,它表示该类型是用于用户ID和组IDS的整数类型(不提及有符号或无符号)。

因此,该标准明确规定uid_tgid_t的类型可以根据平台进行签名或不签名。 假设出现这种不确定性是非常合理的,因为实际实现使用了有符号和无符号类型,并且标准的设计不会使现有实现无效。

Interesting Posts