UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua34
2014-09-10
1 文件访问权限
在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面,
| 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();
if (creat("foo", RWRWRW) < ) {
printf("creat error for foo");
exit(-);
}
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (creat("bar", RWRWRW) < ) {
printf("creat error for bar");
exit(-);
}
exit();
}
编译该程序,生成文件 umaskdemo,然后运行之,
lienhua34:demo$ gcc -o umaskdemo umaskdemo.c
lienhua34:demo$ ./umaskdemo
lienhua34:demo$ ls -l bar foo
-rw------- lienhua34 lienhua34 9月 : bar
-rw-rw-rw- lienhua34 lienhua34 9月 : 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 中所示常量的某种按位或运算构成的。
| 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) < ) {
printf("stat error for foo");
exit(-);
}
if (chmod("foo", (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < ) {
printf("chmod error for foo");
exit(-);
}
if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < ) {
printf("chmod error for bar");
exit(-);
}
exit();
}
编译该程序文件,生成文件 chmoddemo,然后运行该文件,
lienhua34:demo$ gcc -o chmoddemo chmoddemo.c
lienhua34:demo$ ls -l foo bar
-rw------- lienhua34 lienhua34 9月 : bar
-rw-rw-r-- lienhua34 lienhua34 9月 : 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)
UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改的更多相关文章
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...
- UNIX环境编程学习笔记(14)——文件I/O之临时文件
lienhua342014-10-01 ISO C 标准 I/O 库提供了个两个函数 tmpnam 和 tmpfile 以帮助创建临时文件, #include <stdio.h> char ...
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
lienhua342014-09-16 1 文件的时间 每个文件都有三个时间字段,如表 1 所示. 表 1: 文件的三个时间字段 说明 字段 st_atime 文件数据的最后访问时间 st_mtime ...
随机推荐
- /.well-known/apple-app-site-association
Technical Q&A QA1919 Incoming requests for /.well-known/apple-app-site-association file Q: Why ...
- pycharm 操作的一些设置,记录下
机器学习中大量的用到了Python,因此需要有pycharm作为Python的编译工具,配合anconda环境进行配置,将macos,tensorflow ,python的配置记录下: We sugg ...
- Mac下配置Apache Httpd的Https/SSL
Mac下配置Apache Httpd的Https/SSL httpd版本: httpd-2.4.17 jdk版本: jdk1.8.0_65 参考来源: Mac下安装Apache Httpd Mac O ...
- 使用taskset命令来限制进程的CPU
常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源: 这个时候我们就可以把一些不太重要的比如co ...
- solr报错 ERROR SolrDispatchFilter null:ClientAbortException: java.net.SocketException: Broken pipe 原因是nginx截断了请求
[root@localhost nginx]# lltotal 36drwx------. 2 www root 4096 Aug 13 13:25 client_body_tempdrwxr-xr- ...
- IT系统
去年11月11日,也就是我们俗称的“双十一”当天,淘宝集市.淘宝商城天猫联手创造了交易额达191亿的销售神话.然而,即便是这种神话也还不足以成为留传至今的佳话,其中最为重要的原因就是支撑电子商务的 ...
- E/MediaPlayer: start called in state 4, mPlayer(0xcc719a40)解决
在使用MediaPlayer播放音频时报出 E/MediaPlayer: start called in state 4, mPlayer(0xcc719a40)错误 贴出代码 mMediaPlaye ...
- SQL server 分页方法小结
这里面介绍一下常用的分页方法: 1.使用top来分页 select top @pageSize * from table where id not in (select top @pageSize*( ...
- 自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
关于本项目中使用到的庖丁分词的总结: Paoding 详细介绍 庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网.企业内部网使用的中文搜索引擎分词组件.Paodi ...
- 【转】【MySQL】Mysql模糊查询like提速优化
在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来.这个时候查询的效率就 ...