这两个函数可以更改我们现有文件的访问权限。

#include <sys/stat.h>int chmod(const char *pathname,mode_t mode);int fchmod(int filedes,mode_t mode);

以上函数返回0是表示成功,-1,表示不成功。

查看GNU C手册:

int chmod (const char *filename, mode t mode) [Function]
The chmod function sets the access permission bits for the file named by filename to
mode.
If filename is a symbolic link, chmod changes the permissions of the file pointed to by(如果文件名字是链接,chmod通过链接改变权限。而不是链接本身)
the link, not those of the link itself.
This function returns 0 if successful and -1 if not. In addition to the usual file name
errors (see Section 11.2.3 [File Name Errors], page 224), the following errno error
conditions are defined for this function:
ENOENT The named file doesn’t exist.
EPERM This process does not have permission to change the access permissions
of this file. Only the file’s owner (as judged by the effective user ID of
the process) or a privileged user can change them.
EROFS The file resides on a read-only file system.
EFTYPE mode has the S_ISVTX bit (the “sticky bit”) set, and the named file is
not a directory. Some systems do not allow setting the sticky bit on

non-directory files, and some do (and only some of those assign a useful
meaning to the bit for non-directory files).
You only get EFTYPE on systems where the sticky bit has no useful meaning
for non-directory files, so it is always safe to just clear the bit in mode
and call chmod again. See Section 14.9.5 [The Mode Bits for Access Permission],
page 370, for full details on the sticky bit.

int fchmod (int filedes, int mode) [Function]
This is like chmod, except that it changes the permissions of the currently open file(当前已经打开的)
given by filedes.
The return value from fchmod is 0 on success and -1 on failure. The following errno
error codes are defined for this function:
EBADF The filedes argument is not a valid file descriptor.
EINVAL The filedes argument corresponds to a pipe or socket, or something else
that doesn’t really have access permissions.
EPERM This process does not have permission to change the access permissions
of this file. Only the file’s owner (as judged by the effective user ID of
the process) or a privileged user can change them.
EROFS The file resides on a read-only file system.

从上边函数解释可以知道,chmod 函数在制定的文件进行操作,而fchmod函数则对已经打开的文件进行操作。

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

下表所示常量的某种按位或运算构成的。

Chmod函数的mode常量

mode

说明

S_ISUID

S_ISGID

S_ISVIX

执行时设置用户ID

执行时设置组ID

保存正文(粘住位)

S_IRWXU

S_IRUSR

S_IWUSR

S_IXUSR

用户(所有者)读、写和执行

用户(所有者)读

用户(所有者)写

用户(所有者)执行

S_IRWXG

S_IRGRP

S_IWGRP

S_IXGRP

组读、写和执行

组读

组写

组执行

S_IRWXO

S_IROTH

S_IWOTH

S_IXOTH

其他读、写和执行

其他读

其他写

其他执行

上一节我们生成了foo bar两个文件。

下面实例来修改这两个文件的权限模式。

实例

#include "apue.h"int main(void)
{struct stat  statbuf;if(stat("foo",&statbuf)<0)err_sys("stat error for foo");if(chmod("foo",(statbuf.st_mode&~S_IXGRP)|S_ISGID)<0)err_sys("chmod err for foo");if(chmod("bar",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)<0)err_sys("chmod err for bar");exit(0);}

运行结果:

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

  • Solaris等系统对用于普通文件的你那诸位腹语了特殊含义,在这些系统如果我们试图设置普通文件的粘住位,而且有没有超级用户的用户特权。那么mode忠的年诸位将自动被关闭,这意味这只有超级用户才能设置普通文件的年诸位,这样做的理由是方式不怀好意的用户设置年诸位,并由此降低系统性能。
  • 新创建文件的组ID,可能不是调用进程所属组。新文件的组ID,可能是父目录的组ID,特别的,如果新文件的组ID,不等于进程的有效组ID,或者进程附加组ID中的一个,以及进程没有超级用户的特权,那么设置组ID文件,二该文件是有并非该用户所诉的组拥有的。

4.10 粘住位

S_ISVTX位有一有趣历史。

S_ISVTX位被称为粘住位。如果一个可执行程序文件的这一位被设置了,那么在该程序第一次被执行并结束时,其程序正文部分的一个副本仍被保存在交换区中,这使得下次执行该程序时能较快地将其装入内存区。其原因是:

交换区占用连续磁盘空间,可将它视为连续文件,而且一个程序的正文部分在交换区中也是连续存放的,而在一般的UNIX文件系统中,文件的各数据块很可能是随机存放的。

现今较新的UNIX系统大多都配置有虚拟存储系统以及快速文件系统,所以不再需要使用这种技术。

如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一的情况下,才能删除或更名该目录下的文件:1.拥有该文件    2. 拥有该目录    3. 是超级用户

示例:目录/tmp和/var/spool/uucppublic是设置粘住位的典型候选者——任何用户都可在这两个目录中创建文件。任一用户(用户、组和其他)对这两个目录的权限通常都是读、写和执行。但用户不应删除或更名属于其他人的文件,为此在这两个目录的文件模式中都设置了粘住位。

更多内容欢迎访问:http://blog.csdn.net/wallwind

unix环境高级编程-4.9-chmod,fchmod函数和粘住位相关推荐

  1. UNIX 环境高级编程(八)—— fork 函数

    一个现有的进程可以调用 fork 函数创建一个新进程. #include <uinstd.h> pid_t fork(void);// 返回值:子进程返回 0:父进程返回子进程 id:若出 ...

  2. UNIX环境高级编程笔记(14)- 函数sigsuspend 实现父进程子进程同步

    前言 本章主要介绍sigsuspend函数以及实现父进程子进程通过信号的同步. 一.函数sigsuspend #include<signal.h> int sigsuspend(const ...

  3. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. 《Unix环境高级编程》学习笔记:从点到面

    以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...

  5. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  6. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  7. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  8. unix环境高级编程(上)-文件篇

    目录 前言 unix基础知识 unix标准化和实现 unix提供的文件IO 文件和目录 标准IO 系统数据文件 前言 笔者将<unix环境高级编程>主要内容总结为三篇:文件篇,进程篇,高级 ...

  9. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

最新文章

  1. Android—监听器
  2. gitlab服务器邮箱配置
  3. JavaScript语法详解(三)
  4. php-fpm backlog 项的调整
  5. java语言转换c语言,求助大神!!!JAVA转换成C语言
  6. 视频参数(流媒体系统,封装格式,视频编码,音频编码,播放器)对比
  7. linux几秒钟同步一次,Linux时间同步配置方法
  8. 机器学习是如何改善企业生产力的?(内附机器智能版图)
  9. 解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题
  10. 开发API整理(转)
  11. 02- linux下运行.exe文件(wine工具)
  12. C++ Beep函数播放歌曲《千本樱》
  13. 永洪报表工具_国内报表工具排行?
  14. App - 电影天堂第三方客户端
  15. python之AQI分析与预测
  16. gb2312的6763个汉字
  17. 高德地图广告投放的优势、效果!
  18. Android 标题栏及导航栏设计与实现
  19. kubernetes原生ci/cd工具tekton版本升级至v0.18.1
  20. G6信息门户连接不上服务器,G6客户端提示找不到服务器怎么回事 网是通 的

热门文章

  1. 在Github Pages上部署自己的简历
  2. 《无人机DIY》——2.5 无线电控制飞艇
  3. 微信聊天记录数据提取并分析
  4. 西门子Profinet连接EtheCAT伺服驱动器
  5. CMOS Sensor一些术语及其图像质量的调试点
  6. linux-mptcp调度算法,基于RSFSA的MPTCP数据调度算法的研究
  7. 谁是 AR 消费应用创新能手?Google ARCore 和京东 AR 开发者大赛决赛出炉
  8. Unity3D证书(序列号)升级总结
  9. 什么是VMOS功率场效应管,工作原理是什么
  10. 收藏的300首英文歌曲拿出来分享一下 [转自 PUB 外语角感谢雷锋叔叔]