UNIX文件mode_t详解
打开文件、新建文件和关闭文件操作
打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。打开文件的一般形式是:
- open(文件路径, 标志);
函数的返回值是文件描述符,如果打开文件成功返回一个正整数,否则返回-1。标志是用于指定打开文件操作模式的枚举常量,主标志如表13.1所示。
表13.1 打开文件操作的主标志
参 数 |
说 明 |
参 数 |
说 明 |
O_RDONLY |
以只读方式打开文件 |
O_RDWR |
以可读写方式打开文件 |
O_WRONLY |
以只写方式打开文件 |
|
|
主标志是互斥的,使用其中一种则不能再使用另外一种。除了主标志以外,还有副标志可与它们配合使用,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与(|)运算符,如表13.2所示。
表13.2 打开文件操作的副标志
参 数 |
说 明 |
O_APPEND |
读写文件从文件尾部开始移动,所写入 的数据追加到文件尾 |
O_TRUNC |
若文件存在并且以可写的方式打开时, 此标志会将文件长度清为0,而原来存于 该文件的资料也会消失 |
O_CREAT |
若路径中的文件不存在则自动建立该文件 |
O_EXCL |
如果与O_CREAT同时设置,此指令会去检 查文件是否存在,文件若不存在则建立该文 件,否则将导致打开文件错误。此外,若 O_CREAT与O_EXCL同时设置,并且将要 打开的文件为符号连接,则将导致打开文件失败 |
新建文件操作是在打开文件操作的函数上加入O_CREAT副标志实现的。当路径中的文件不存在时,则创建一个新文件。创建新文件的同时可设置文件的权限,这时函数需要增加一组实际参数,形式为:
- open(文件路径, 标志, 权限标志);
文件权限标志如表13.3所示。
表13.3 文件权限标志
参 数 |
说 明 |
参 数 |
说 明 |
S_IRUSR |
所有者拥有 读权限 |
S_IXGRP |
群组拥有执 行权限 |
S_IWUSR |
所有者拥有 写权限 |
S_IROTH |
其他用户拥 有读权限 |
S_IXUSR |
所有者拥有 执行权限 |
S_IWOTH |
其他用户拥 有写权限 |
S_IRGRP |
群组拥有读权限 |
S_IXOTH |
其他用户拥 有执行权限 |
S_IWGRP |
群组拥有写权限 |
|
|
文件权限标志也可以使用加权数字表示,这组数字被称为umask变量,它的类型是mode_t,是一个无符号八进制数。umask变量的定义方法如表13.4所示。umask变量由3位数字组成,数字的每一位代表一类权限。用户所获得的权限是加权数值的总和。例如764表示所有者拥有读、写和执行权限,群组拥有读和写权限,其他用户拥有读权限。
表13.4 umask变量表示方法
加 权 数 值 |
第1位 |
第2位 |
第3位 |
4 |
所有者拥有 读权限 |
群组拥有读权限 |
其他用户拥 有读权限 |
2 |
所有者拥有 写权限 |
群组拥有写权限 |
其他用户拥 有写权限 |
1 |
所有者拥有 执行权限 |
群组拥有执行权限 |
其他用户拥 有执行权限 |
新建文件的另一个函数是creat(),该函数的一般形式是:
- creat(路径, umask);
当文件被成功创建函数的返回值为0,否则为-1。当文件不需要使用了,则可以使用close()函数关闭文件。关闭文件的一般形式为:close(文件描述符),如果关闭文件成功,close()函数的返回0,否则返回-1。
下例将演示打开文件、新建文件和关闭文件这3种操作。程序的逻辑为:指定一个路径,如果该文件存在,输出提示信息,关闭该文件;如果该文件不存在,则新建文件并设置文件属性,输出提示信息,然后关闭该文件。完整的代码如下:
#include <fcntl.h> // 提供open()函数
#include <sys/types.h> // 提供mode_t类型
#include <sys/stat.h> // 提供open()函数的符号
#include <unistd.h> // 提供close()函数
#include <stdio.h>
int main()
{ int f; // 声明变量f,
用于保存文件标识符 const char *f_path = "test"; // 定义路径字符串 mode_t f_attrib; // 声明mode_t
型变量,保存文件属性 f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; // 为umask变量赋值 f = open(f_path, O_RDONLY); // 以只读方式打开文件 if (f == -1) { // 判断文件是否打开成功 f =open(f_path, O_RDWR | O_CREAT, f_attrib); // 创建新文件 if (f != -1) //
判断文件创建是否成功 puts("创建一个新文件"); else { puts("无法创建新文件,程序退出"); return 1; } } else puts("文件打开成功"); close(f); // 关闭文件 return 0;
}
该程序首先判断是否存在文件test,判断的方法是用open()函数打开test文件,如果返回值是-1,则表示该文件不存在(有时候并非如此)。当文件不存在时,使用open()函数创建该文件,并在程序最后关闭。为mode_t型变量f_attrib赋值的方法使用了按位计算操作,将表示文件权限的常量进行按位或计算,计算的结果与八进制数0664相同,如图13.3所示。
注:这篇文章来自博客园一博主的贡献,感谢博主的分享
UNIX文件mode_t详解相关推荐
- C 和 C++ 文件操作详解
来源:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551662.html 来源:http://www.cnblogs.com/likebet ...
- UNIX经典命令详解
UNIX经典命令详解 第一章 目录及文件操作命令 1.1 ls [语法]: ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......] [说明]: ls 命令列出指定目录下 ...
- 制作CYDIA发布源的DEB文件,详解!
原文地址:制作CYDIA发布源的DEB文件,详解!作者:NeoZ 首先需要一个可以编辑和压制的环境,Ubuntu/Debian 是 deb 文件系统的原生系统,在兼容性和处理性能上最好. 如果你没有L ...
- Qt QFile文件操作详解
Qt QFile文件操作详解 很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写.创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office.PDFedit 等 ...
- 基于php下载文件的详解
基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢 ...
- linux文件权限详解
linux文件权限详解 一.文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限: ...
- VMware虚拟机文件夹中各文件作用详解
VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...
- 每天一个linux命令(2):文件权限详解
Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允 ...
- java读取本地文件_java 读取本地文件实例详解
java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...
最新文章
- 第二期安全狗讲坛3月11日开始
- 对讲机的那点事:带你玩转LD800数字车载台读、写频操作:一
- 用 Redis 处理 jsonwebtoken 生成的 Token
- 用例子来彻底搞明白Virtual 和 非 virtual(C#)
- jquery.form 和MVC4做无刷新上传DEMO
- react native 的赋值比较,空字符串以及undefined
- Natasha 4.0 探索之路系列(三) 基本的动态编译
- 使用try-with-resources替代try finally释放资源
- 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?
- flex布局怎么设置子元素大小_48张小图带你领略Flex 布局之美
- python字符串(string)方法整理
- VMware虚拟机找不到USB设备该怎么办?
- 在VS2010中使用Git管理源代码
- 论文排版 | Texworks
- 史上最全的前端资源汇总(上)
- 开发者的固化思维及解决办法
- yolov4用1050ti_Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4
- php图形验证码验证,php图片验证码代码
- 嵌入式--LCD常用接口介绍
- css div自适应高度height