linux文件I/O之 open() 函数用法

news2024/11/15 19:41:25

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef unsigned int mode_t ;

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

函数功能

打开或创建一个文件

返回值

成功返回一个新的文件描述符(指代这个打开的文件),失败则返回 -1,并设置 errno 为相对应的错误标志

参数

pathname:路径名,标识要打开的文件(或目录)(例如:"./test.txt"、"/etc/passwd")

flags:位掩码,用于指定文件的打开模式。通过 O_RDONLY(只读)、O_WRONLY(只写) 或         O_RDWR(可读可写)中的其中一个打开文件的方式 与 下面的 0 个或多个可选模式按 位或(|) 操作得到。

flags说明
O_CREAT若文件不存在将创建它。
O_EXCL这个标志需要和 O_CREAT 结合在一起使用,表明如果参数 pathname 标识的文件已经存在,则打开失败,此时 errno 会被设置为 EEXIST。 换言之,这个标志确保 open() 函数就是创建新文件的。
O_NOCTTY如果参数 pathname 引用的是终端设备,O_NOCTTY 标志表明不将该设备分配作为此进程的控制终端设备。如果 pathname 引用的不是终端设备,则此标志无效。
O_TRUNC如果文件已经存在且为普通文件,而且打开模块又是写(即是以 O_WRONLY 或 O_RDWR 模式打开的),那么将清空文件的原有的所有内容,并将其长度设置为 0。若文件是 FIFO 或终端设备文件,此标志会被忽略。
O_APPEND每次写文件都追加到文件的尾端。(不会覆盖原有的内容)
O_NONBLOCK以非阻塞模式打开文件。
O_NDELAY以非阻塞模式打开文件,跟 O_NONBLOCK 是一样的,指向同一个标志位,推荐使用 O_NONBLOCK 标志,因为 O_NDELAY  是系统早期版本引入的,在读操作时,如果读不到数据,O_NDELAY会使 I/O 函数马上返回 0,但这又衍生出一个问题,因为读取到文件末尾(EOF)时返回的也是 0,这样无法区分是哪种情况。因此,O_NONBLOCK 就产生出来,它在读取不到数据时会回传 -1,并且设置 errno 为 EAGAIN。
O_SYNC以同步 I/O 方式打开文件,即每次 write 等待物理 I/O 操作完成,包括由该 write 操作引起的文件属性更新所需的 I/O 都操作完成。
O_LARGEFILE支持大文件模式打开文件,在 32 位操作系统中使用此标志,允许打开那些用 31 位都不能表示其长度的大文件。
O_DIRECTORY如果参数 pathname 不是目录,则打开失败,此时 errno 被设置为 ENOTDIR。
O_NOFOLLOW如果参数 pathname 引用的是一个符号链接,则 open() 函数打开失败,此时 errno 被设置为 ELOOP。
O_CLOEXEC将新打开的文件描述符设置 FD_CLOEXEC 标志,可以免去程序执行 fcntl() 函数时的 F_GETFD 和 F_SETFD 操作来设置 close-on-exec 标志的额外工作。

linux 内核中 <fcntl.h> 头文件对 O_NDELAY 的定义如下所示:

#ifndef O_NDELAY
#define O_NDELAY	O_NONBLOCK
#endif

在 linux 内核中 <fcntl.h> 头文件对参数 flags 所有有效取值如下所示:

/* list of all valid flags for the open/openat flags argument: */
#define VALID_OPEN_FLAGS \
	(O_RDONLY | O_WRONLY | O_RDWR | O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC | \
	 O_APPEND | O_NDELAY | O_NONBLOCK | O_NDELAY | __O_SYNC | O_DSYNC | \
	 FASYNC	| O_DIRECT | O_LARGEFILE | O_DIRECTORY | O_NOFOLLOW | \
	 O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE)

mode:位掩码,用于当调用 open() 函数创建新文件时,指定文件的访问权限。如果参数 flags 中没有指定 O_CREAT 标志,则可以省略 mode 参数。

mode 参数所有有效取值如下:

mode说明
S_ISUID执行时设置用户 ID
S_ISGID执行时设置组 ID
S_ISVTX粘着位,对目录使用
S_IRWXU用户可读,可写,可执行
S_IRUSR用户可读
S_IWUSR用户可写
S_IXUSR用户可执行
S_IRWXG组可读,可写,可执行
S_IRGRP组可读
S_IWGRP组可写
S_IXGRP组可执行
S_IRWXO其他用户可读,可写,可执行
S_IROTH其他用户可读
S_IWOTH其他用户可写
S_IXOTH

其他用户可执行

S_IRWXUGO

用户、同组用户以及其他用户都可读、可写、可执行

S_IRUGO

用户、同组用户以及其他用户都可读

S_IWUGO

用户、同组用户以及其他用户都可写

S_IXUGO

用户、同组用户以及其他用户都可执行

S_IALLUGO

以上列举的所有权限都有

在 linux 内核中 <sys/stat.h> 头文件对 mode 参数的有效取值定义如下所示:

#define S_ISUID  0004000
#define S_ISGID  0002000
#define S_ISVTX  0001000

#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

#define S_IRWXUGO	(S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO	(S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO		(S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO		(S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO		(S_IXUSR|S_IXGRP|S_IXOTH)

例子

以下程序功能:打开 "./log.txt" 文件,并往该文件内容的末尾写一行 "hello world\n"

#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int flags = O_WRONLY | O_CREAT | O_APPEND; /* 只读,没有该文件则创建,写时从文件内容的末尾附加新内容 */
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; /* rw-rw-rw- */
    int fd = open("./log.txt", flags, mode); 
    if (fd < 0) {
        perror("open error");
        exit(EXIT_FAILURE);
    }
    
    char buf[] = "hello world\n";
    ssize_t nwrite = write(fd, buf, strlen(buf));
    if (nwrite < 0) {
        perror("write error");
        exit(EXIT_FAILURE);
    }
    printf("write success\n");

    close(fd);

    return 0;
}

参考:

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

《Linux-UNIX系统编程手册》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.2、Flink任务怎样读取文件中的数据

目录 1、前言 2、readTextFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 3、readFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 4、fromSource(FileSource) 推荐使用 1、前言 思考: 读取文件时可以设置哪些规则呢&#xff1f; 1. 文件的格式(tx…

上海震坤行工业超市入选胡润百富“中国产业互联网30强”

上海震坤行工业超市入选胡润百富“中国产业互联网30强” &#xff08;2023年6月27日&#xff0c;广州&#xff09;全面提供全球最具潜力创业企业榜单的胡润研究院今日发布《2023胡润中国产业互联网30强》&#xff08;Hurun China IIoT Top 30 2023&#xff09;&#xff0c;榜…

利用Ettercap进行DNS欺骗攻击

一、域名系统&#xff08;DNS&#xff09; 域名系统DNS是Internet上使用的命名系统&#xff0c;用于将系统名称转换为人们易于使用的IP地址。域名系统是基于互联网的前身ARPANET开发的&#xff0c;在ARPANET时代&#xff0c;主机名和对应的IP地址是通过HOST.TXT文件集中管理的…

IPO观察丨困于门店扩张的KK集团,还能讲好增长故事吗?

KK集团发起了其IPO之路上的第三次冲击。 近日&#xff0c;KK集团更新了招股书&#xff0c;继续推进港交所上市进程&#xff0c;此前两次上市搁置后终于有了新动向。从更新内容来看&#xff0c;KK集团招股书披露了公司截至2023年一季度的最新业绩&#xff0c;交出一份不错的“成…

你怎么看这MyBatis-flex框架 ?(入门篇)

1、简介 在国内目前使用最多的ORM框架就是Mybatis-Plus&#xff0c;也不得不承认&#xff0c;Mybatis-Plus相对于JPA而言&#xff0c;也确实好用一些&#xff08;就个人而言&#xff09;&#xff0c;但是在国外JPA框架还是挺火的&#xff0c;因为JPA是一个完全的ORM框架&#x…

等了10年,工信部的APP备案终于来了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 2005年3月&#xff0c;工信部要求所有境内网站都要进行网站备案、公安备案。 2023年8月&#xff0c;工信部要求所有的APP、小程序进行备案。否则…… 这绝对是一个移动互联网创业分水岭&#xff0…

希尔排序——C语言andPython

前言 步骤 代码 C语言 Python 总结 前言 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;它通过将数组分成多个子序列进行排序&#xff0c;逐步减小子序列的长度&#xff0c;最终完成整个数组的排序。希尔排序的核心思想是通过排序较远距…

重温HashMap底层原理

目录 1.HashMap概述 2.JDK7与JDK8的HashMap区别 3.HashMap的主要方法分析 4.常见问题分析总结 1.HashMap概述 HashMap是使用频率最高的用于映射键值对(key和value)处理的数据类型。随着JDK版本的跟新&#xff0c;JDK1.8对HashMap底层的实现进行了优化&#xff0c;列入引入…

JTS Self-intersection异常TopologyException: side location conflict解决办法

JTS Self-intersection异常TopologyException: side location conflict解决办法 举例&#xff1a;问题围栏 MULTIPOLYGON (((114.0905685 32.1120567, 114.0905685 32.112957, 114.0905685 32.1138535, 114.0905685 32.1147537, 114.0905685 32.115654, 114.0905685 32.11655…

深入理解Go语言中的并发编程【30】【多路复用】

文章目录 多路复用 多路复用 操作系统级的I/O模型有&#xff1a; 阻塞I/O非阻塞I/O信号驱动I/O异步I/O多路复用I/O   Linux下&#xff0c;一切皆文件。包括普通文件、目录文件、字符设备文件&#xff08;键盘、鼠标&#xff09;、块设备文件&#xff08;硬盘、光驱&#xff…

【LeetCode】按摩师

按摩师 题目描述算法分析编程代码 链接: 按摩师 题目描述 算法分析 编程代码 class Solution { public:int massage(vector<int>& nums) {int n nums.size();if(n 0) return 0;vector<int> f(n);auto g f;f[0] nums[0];for(int i 1;i<n;i){f[i] g[i…

Winform中DatagridView 表头实现一个加上一个checkBox,实现全选选项功能

实现效果 点击checkBox1或者直接在第一列列表头点击即可实现 代码实现 我的datagridview叫dgv 我在datagridview已经默认添加了一个DataGridViewCheckBoxColumn&#xff0c;勾选时value为1&#xff0c;不勾选时value为0 第一种通过可视化拖动一个checkBox来实现 拖动组…

ElasticSearch单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

餐饮管理系统ssm酒店饭店仓库进销存jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 餐饮管理系统ssm 系统有1权限&#xff1a;管理员 二…

使用MethodInterceptor和ResponseBodyAdvice做分页处理

目录 一、需求 二、代码实现 父pom文件 pom文件 配置文件 手动注册SqlSessionFactory&#xff08;MyBatisConfig &#xff09; 对象 实体类Users 抽象类AbstractQuery 查询参数类UsersQuery 三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…

C++项目:在线五子棋对战网页版--session管理模块开发

session 在WEB开发中&#xff0c;HTTP协议是⼀种⽆状态短链接的协议&#xff0c;这就导致⼀个客⼾端连接到服务器上之后&#xff0c;服务器不知道当前的连接对应的是哪个用户&#xff0c;也不知道客⼾端是否登录成功&#xff0c;这时候为客⼾端提所有服务是不合理的。因此&am…

微信昵称后面的“小耳朵”,原来有这么多用处,让我带你涨知识

微信昵称后面的“小耳朵”&#xff0c;原来有这么多用处&#xff0c;让我带你涨知识 大家都知道&#xff0c;在微信昵称后面加上一个"小耳朵"符号是一种常见的表达方式&#xff0c;但你知道吗&#xff1f;这个看似简单的符号其实有着丰富的用处和意义。让我带你了解…

java中io流、属性集Properties、缓冲流、转换流、序列化和反序列化、打印流、网络编程(TCP通信程序、文件复制案例、文件上传案例、B/S服务案例)

IO流&#xff1a; io流中i表示input输入&#xff0c;o表示output输出&#xff0c;流表示数据&#xff08;字符&#xff0c;字节&#xff0c;1个字符2个字节8个位&#xff09;&#xff1b;这里的输入输出是以内存为基础&#xff0c;将数据从内存中输出到硬盘的过程称为输出&…

CMSIS—OS(V1/V2)

在RTOS基础上再封装一层API。 更换项目中所使用到的RTOS。 例如将freertos项目替换为ucos RTX liteos等其他RTOS。 只需更改该CMSIS-OS的API所调用的RTOS的API。 更换RTOS的意义何在&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&am…

函数的学习

函数学习 最后附上全部java源码&#xff0c;可自行下载学习 文章目录 函数入门函数重载函数可变个数参数foreach输出传参 基本数据类型传参_引用数据类型文件夹展示所有里面的文件使用递归算法展示文件夹下所有文件1加到100的递归调用下载链接 函数入门 函数重载 public class…