当前位置: 首页 > news >正文

UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

lienhua34
2014-09-10

1 文件访问权限

在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面,

 

表 1: 文件的 9 个访问权限位
 st_mode 屏蔽 意义
 S_IRUSR 用户 -读
 S_IWUSR 用户 -写
 S_IXUSR 用户 -执行
 S_IRGRP  组 -读
 S_IWGRP 组 -写
 S_IXGRP 组 -执行
 S_IROTH 其他 -读
 S_IWOTH 其他 -写
 S_IXOTH 其他 -执行


2 新文件访问权限的屏蔽

每个进程都有一个单独的跟进程相关联的文件模式创建屏蔽字(file creation mask). 每个进程的文件模式创建屏蔽字跟该进程的父进程没有关系,不继承于父进程的文件模式创建屏蔽字,本进程文件模式创建屏蔽字变更对父进程的文件模式进程也不会产生任何影响。

在进程创建一个新文件时,会通过文件模式创建屏蔽字和创建新文件时指定的文件访问权限位一起决定新文件最终的文件访问权限。对于任何在文件模式创建屏蔽字中为 1 的位,在文件 mode 中的相对应位则一定被关闭。

umask 函数为进程设置文件模式创建屏蔽字,并返回以前的值。

#include <sys/stat.h>

mode_t umask(mode_t cmask);

返回值:以前的文件模式创建屏蔽字。

其中,参数 cmask 是由表 1 中列出的 9 个常量中的若干个按位或构成的。下面程序创建两个文件,创建第一个文件 foo 时将进程的文件模式创建屏蔽字清空,而创建第二个文件之前,则屏蔽了所有组和其他用户的读写权限。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
int
main(void)
{
    umask(0);
    if (creat("foo", RWRWRW) < 0) {
    printf("creat error for foo");
        exit(-1);
    }
    umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    if (creat("bar", RWRWRW) < 0) {
        printf("creat error for bar");
        exit(-1);
    }
    exit(0);
}

编译该程序,生成文件 umaskdemo,然后运行之,

lienhua34:demo$ gcc -o umaskdemo umaskdemo.c
lienhua34:demo$ ./umaskdemo
lienhua34:demo$ ls -l bar foo
-rw------- 1 lienhua34 lienhua34 0 9月 3 23:51 bar
-rw-rw-rw- 1 lienhua34 lienhua34 0 9月 3 23:51 foo

3 文件访问权限的更改

UNIX 提供了两个函数 chmod 和 fchmod 实现对现有文件访问权限的更改。

#include <sys/stat.h>

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

int fchmod(int filedes, mode_t mode);

两个函数返回值:若成功则返回0,若出错则返回-1。

chmod 函数在指定的文件上进行操作,而 fchmod 函数则对已打开的文件进行操作。

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

参数 mode 是表 2 中所示常量的某种按位或运算构成的。

表 2: chmod 函数的 mode 常量
mode说明
S_ISUID执行时设置用户 ID
S_ISGID执行时设置组 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 的设置组 ID 位、关闭了组执行位。而对于文件 bar 则强制设置为某个指定的访问权限。

#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
int
main(void)
{
    struct stat statbuf;
    if (stat("foo", &statbuf) < 0) {
        printf("stat error for foo");
        exit(-1);
    }
    if (chmod("foo", (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < 0) {
        printf("chmod error for foo");
        exit(-1);
    }
    if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
        printf("chmod error for bar");
        exit(-1);
    }
    exit(0);
}

编译该程序文件,生成文件 chmoddemo,然后运行该文件,

lienhua34:demo$ gcc -o chmoddemo chmoddemo.c
lienhua34:demo$ ls -l foo bar
-rw------- 1 lienhua34 lienhua34 0 9月 3 23:51 bar
-rw-rw-r-- 1 lienhua34 lienhua34 0 9月 3 23:51 foo
lienhua34:demo$ ./chmoddemo
lienhua34:demo$ ls -l foo bar
-rw-r--r-- 1 lienhua34 lienhua34 0 9月 3 23:51 bar -rw-rwSr-- 1 lienhua34 lienhua34 0 9月 3 23:51 foo

(done)

相关文章:

  • SoftLayer®凭借Flex Images™消融物理与虚拟服务器之间的界线
  • 康动仪数据传输不成功可以用如下办法解决
  • 如何使用MSDN
  • JavaScript document 对象
  • [Git].gitignore失效的原因
  • 不知道能不能写小说
  • Appserv配置虚拟主机设置教程
  • 深入理解linux内核: linux内核
  • spring中context:property-placeholder/元素
  • 第二十章、启动流程、模块管理与 Loader
  • 一个体检系统设想
  • 彩生活_百度百科
  • ios 使用自定义字体
  • 从一堆数中随机取出一些值的方法
  • 【MFC】ID命名和数字约定
  • .pyc 想到的一些问题
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Apache的基本使用
  • CSS实用技巧
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java小白进阶笔记(3)-初级面向对象
  • SSH 免密登录
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 简单基于spring的redis配置(单机和集群模式)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 免费小说阅读小程序
  • 如何在 Tornado 中实现 Middleware
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用Python写一份独特的元宵节祝福
  • # 达梦数据库知识点
  • #HarmonyOS:Web组件的使用
  • (0)Nginx 功能特性
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)STL算法之搜索
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (全注解开发)学习Spring-MVC的第三天
  • (转)重识new
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *Django中的Ajax 纯js的书写样式1
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @RequestMapping-占位符映射
  • @SuppressWarnings注解
  • @Validated和@Valid校验参数区别
  • []FET-430SIM508 研究日志 11.3.31
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码