【linux】open函数创建新文件及umask函数使用
2017-12-14 13:44
996 查看
首先我们来看一下open函数的原型
由函数原型可知open函数有一个可变参数mode,当使用open函数创建新文件时,需选用常量O_CREAT为构成参数oflag的一部分,此时我们需要通过参数mode为新建的文件设置访问权限。
参数mode由下面9个文件访问权限位中的若干位相”或”构成。
另外mode参数也可以通过一个3位8进制数来表示,例如:
S_IRUSR | S_IWUSR | S_IRGRP | S_IWOTH 可用八进制数 0642来表示
0642的二进制表示为 110 100 010 显然这个二进制数的后9位分别对应了 用户、组、其他 相应的 读、写、执行 权限
不过新建文件的访问权限并不是完全由mode参数决定的,而是要和文件模式创建屏蔽字umask经过如下计算来得到。
下面介绍umask函数,它可以为进程设置文件模式创建屏蔽字,并返回之前的值。
下面通过一段代码说明用open函数创建新文件的过程以及umask函数的使用
shell下运行结果
由以上的结果可以看出,修改进程的umask值并不会影响其父进程的umask值。
并且如果想要新创建文件的访问权限完全由用户决定,那么只需在调用open函数前用umask函数将umask值置为0即可。
#include <fcntl.h> int open(const char *path, int oflag,.../*mode_t mode*/); //返回值:若成功,返回文件描述符;若失败,返回-1
由函数原型可知open函数有一个可变参数mode,当使用open函数创建新文件时,需选用常量O_CREAT为构成参数oflag的一部分,此时我们需要通过参数mode为新建的文件设置访问权限。
参数mode由下面9个文件访问权限位中的若干位相”或”构成。
st_mode | 含义 |
---|---|
S_IRUSR | 用户读 |
S_IWUSR | 用户写 |
S_IXUSR | 用户执行 |
S_IRGRP | 组读 |
S_IWGRP | 组写 |
S_IXGRP | 组执行 |
S_IROTH | 其它读 |
S_IWOTH | 其它写 |
S_IXOTH | 其它执行 |
S_IRUSR | S_IWUSR | S_IRGRP | S_IWOTH 可用八进制数 0642来表示
0642的二进制表示为 110 100 010 显然这个二进制数的后9位分别对应了 用户、组、其他 相应的 读、写、执行 权限
不过新建文件的访问权限并不是完全由mode参数决定的,而是要和文件模式创建屏蔽字umask经过如下计算来得到。
新的访问权限 = mode & (~umask)
文件模式创建屏蔽字umask
umask值用于控制用户所创建文件的默认权限,umask也是一个mode_t类型的值,它的每一位都代表一种要屏蔽的权限。每个进程都有自己的umask值,系统会自动为其设置一个值。通过shell的umask命令可以查看。下面介绍umask函数,它可以为进程设置文件模式创建屏蔽字,并返回之前的值。
#include <sys/stat.h> mode_t umask(mode_t cmask); //cmask为要设置的新值
下面通过一段代码说明用open函数创建新文件的过程以及umask函数的使用
#include <sys/stat.h> #include <fcntl.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) int main() { umask(0); open("file1", O_CREAT, RWRWRW); umask(0077); //屏蔽组和其它的所有权限 open("file2", O_CREAT, RWRWRW); return 0; }
shell下运行结果
$ umask 0002 $ ./a.out $ ls -l file1 file2 -rw-rw-rw- 1 waiting waiting 0 12月 14 13:30 file1 -rw------- 1 waiting waiting 0 12月 14 13:30 file2 $ umask 0002
由以上的结果可以看出,修改进程的umask值并不会影响其父进程的umask值。
并且如果想要新创建文件的访问权限完全由用户决定,那么只需在调用open函数前用umask函数将umask值置为0即可。
相关文章推荐
- linux 学习笔记(三):open、creat、close 函数的使用,文件的创建、打开与关闭
- [Linux文件属性]使用umask函数指定新建文件权限
- 请尝试使用open、lseek等函数创建 一个含有空洞的文件
- Linux中C语言open函数打开或创建文件详细讲解
- Linux 使用creat和open创建文件时参数mode的值
- Linux中C语言open函数打开或创建文件详细讲解
- Linux中C语言open函数打开或创建文件详细讲解
- 通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件
- C++ 选择文件对话框 函数 GetOpenFileName 使用的一个demo
- linux下库文件的创建和使用
- Linux使用文件创建swap
- Linux、apache 无法使用PHP创建目录和文件
- 在Linux下创建一个大文件,即制造磁盘I/O异常,使用dd命令
- 通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件。
- Linux应用程序-文件编程-file_open()函数疑问
- 临时文件创建及使用函数
- Linux下库文件学习(三)如何创建和使用库文件
- linux下使用现有目录创建文件系统
- 在Linux下获取当前运行程序可执行文件全路径(不使用real_path()函数)
- Linux 文件读写函数的使用方法