4.9 函数chmod、fchmod和fchmodat

    chmod、fchmod和fchmodat这3个函数使我们可以更改现有文件的访问权限。

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);

int fchmod(int fd, mode_t mode);

int fchmodat(int fd, const char *pathname, mode_t mode, int flag);

                                                                    3个函数返回值:若成功,返回0;若出错,返回-1.        

    chmod函数在指定的文件上进行操作,而fchmod函数则对已打开的文件进行操作。fchmodat函数与chmod函数在下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为相对路径。否则,fchmodat计算相对于打开目录(由fd参数指向)的pathname。flag参数可以用于改变fchmodat的行为,当设置了AT_SYMLINK_NOFOLLOW标志时,fchmodat并不会跟随符号链接。

    为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者该进程必须具有超级用户权限。

    参数mode是图4-11中所示常量的按位或。

    注意,在图4-11中,有9项是取自图4-6中的9个文件访问权限位。我们另外加了6个,它们是两个设置ID常量(S_ISUID和S_ISGID)、保存正文常量(S_ISVTX)以及3个组合常量(S_IRWXU、S_IRWXG和S_IRWXO)。

 在运行图4-12程序中,这两个文件的最后状态是:(略)。

 在本例中,不管文件bar的当前权限位如何,我们都将其权限设置为一个绝对值。对文件foo,我们相对于其当前状态设置权限。为此,先调用stat获得其当前权限,然后修改它。我们显式地打开了设置组ID位、关闭了组执行位。注意,ls命令将组执行权限表示为S,它表示设置组ID已经设置,同时,组执行未设置。

    最后还要注意,在运行图4-12程序后,ls命令列出的时间和日期并没有改变。在4.19节中,我们会了解到chmod函数更新的只是i节点最近一次被更改的时间。按系统默认方式,ls -l列出的是最后修改文件内容的时间。

    chmod函数在下列条件下自动清除两个权限位。

  • Solaris等系统对用于普通文件的黏着位赋予了特殊含义,在这些系统上如果我们试图设置普通文件的黏着位(S_ISVTX),而且又没有超级用户权限,那么mode中的黏着位自动关闭。这意味着只有超级用户才能设置普通文件的黏着位。这样做的理由是防止恶意用户设置黏着位,由此影响系统性能。
  • 新创建的组ID可能不是调用进程所属的组。回忆一下4.6节,新文件的组ID可能是父目录的组ID。特别地,如果新文件的组ID不等于进程的有效ID或者进程附属组ID中的一个,而且进程没有超级用户权限,那么设置组ID位会被自动被关闭。这就防止了用户创建一个设置组ID文件,而该文件是由并给该用户所属的组拥有的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值