遵循规范

setfsgid()是特定于Linux的,不应在旨在可移植的程序中使用。

SETFSGID - Linux手册页

Linux程序员手册 第2部分
更新日期: 2019-05-09

另外参见

kill(2),setfsuid(2),功能(7),凭据(7)

语法

#包括

int setfsgid(uid_t fsgid);

名称

setfsgid-设置用于文件系统检查的组标识

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

BUGS

没有任何错误指示返回给调用方,并且成功和不成功的调用都返回相同值的事实使得无法直接确定调用是成功还是失败。相反,调用者必须求助于进一步调用(例如setfsgid(-1))的返回值(该调用将始终失败),以确定先前对setfsgid()的调用是否更改了文件系统组ID。至少,呼叫失败时应返回EPERM(因为呼叫者缺乏CAP_SETGID功能)。

说明

在Linux上,进程同时具有文件系统组ID和有效组ID。 (特定于Linux的)文件系统组ID用于访问文件系统对象时的权限检查,而有效的组ID用于其他某些类型的权限检查(请参阅凭据(7))。

通常,进程的文件系统组ID的值与其有效组ID的值相同。之所以如此,是因为每当更改进程的有效组ID时,内核也会将文件系统组ID更改为与有效组ID的新值相同。通过使用setfsgid()将其文件系统组ID更改为fsgid中给定的值,进程可以使其文件系统组ID的值与有效组ID偏离。

仅当调用者是超级用户或fsgid与调用者的真实组ID,有效组ID,已保存的set-group-ID或当前文件系统用户ID匹配时,setfsgid()才会成功。

返回值

无论成功还是失败,此调用均返回调用者的先前文件系统组ID。

备注

文件系统组ID概念和setfsgid()系统调用是出于历史原因而发明的,这些原因不再适用于现代Linux内核。有关为何如今不需要同时使用setfsuid(2)和setfsgid()的讨论,请参见setfsuid(2)。

原始的Linux setfsgid()系统调用仅支持16位组ID。随后,Linux 2.4添加了支持32位ID的setfsgid32()。 glibc setfsgid()包装函数透明地处理了内核版本之间的差异。

C library/kernel differences

在glibc 2.15和更早版本中,当此系统调用的包装程序确定参数不能在没有整数截断的情况下传递给内核(因为内核较旧且不支持32位组ID),它将返回-1。并将errno设置为EINVAL而不尝试系统调用。

版本

从1.2版开始,Linux中存在此系统调用。

日期:2019-08-20 17:59:20 来源:oir作者:oir