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

【4】DongshanPI-Seven 应用开发_文件IO

目录

  • 1.文件IO
    • 1.1 文件IO分类
    • 1.2 查看系统调用IO用法
  • 2. open 函数
  • 3. write 函数
  • 4. read 函数
  • 5 dup函数

1.文件IO

1.1 文件IO分类

在Linux系统中,一切都是“文件”:普通文件、驱动程序、网络通信等。所有的操作都是通过文件IO来操作的。

在Linux操作文件时,有2套函数

  • 标准IO: fopen/fread/fwrite/fseek/fflush/fclose
  • 系统调用IO: open/read/write/lseek/fsync/close

这2种IO的区别
标准IO是在系统调用IO的基础上封装出的一套函数,标准IO引入了用户buffer,其底层还是系统调用IO。
用户buffer的作用:系统调用IO每读一次都进入一次内核,效率低。在使用fread时,会一次读取出很多字节,存入到用户buffer中,后续的read就从用户buffer中读。写入时也是先写入到用户buffer中,当达到一定条件后,一次性写入到内核中。使用标准IO可以提高效率。

1.2 查看系统调用IO用法

man手册可以查看命令的用法,还可以查看函数的详细介绍。
输入 man man 命令,可以看到包含9大类手册:

MAN(1)                                                             Manual pager utils                                                             MAN(1)NAMEman - an interface to the on-line reference manualsSYNOPSISman  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R  encoding]  [-L  locale]  [-m  system[,...]] [-M path] [-S list] [-e extension] [-i|-I][--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding]  [--no-hyphenation]  [--no-justification][-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page[.section] ...] ...man -k [apropos options] regexp ...man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...man -f [whatis options] page ...man  -l  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R  encoding]  [-L  locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string] [-t][-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...man -w|-W [-C file] [-d] [-D] page ...man -c [-C file] [-d] [-D] page ...man [-?V]DESCRIPTIONman is the system's manual pager.  Each page argument given to man is normally the name of a program, utility or function.  The manual page asso‐ciated  with  each  of  these arguments is then found and displayed.  A section, if provided, will direct man to look only in that section of themanual.  The default action is to search in all of the available sections following a pre-defined order ("1 n l 8 3 2 3posix 3pm 3perl 3am 5 4  96  7"  by default, unless overridden by the SECTION directive in /etc/manpath.config), and to show only the first page found, even if page existsin several sections.The table below shows the section numbers of the manual followed by the types of pages they contain.1   Executable programs or shell commands				// 命令2   System calls (functions provided by the kernel)		// 系统调用3   Library calls (functions within program libraries)	// 函数库调用4   Special files (usually found in /dev)				// 特殊文件5   File formats and conventions eg /etc/passwd			// 文件格式和约定6   Games												// 游戏7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)	// 杂项8   System administration commands (usually only for root)	// 系统管理命令9   Kernel routines [Non standard]							// 内核例程A manual page consists of several sections.

查看系统调用IO

man 2 open输出内容:
OPEN(2)                                                         Linux Programmer's Manual                                                        OPEN(2)NAMEopen, openat, creat - open and possibly create a fileSYNOPSIS#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);int openat(int dirfd, const char *pathname, int flags);int openat(int dirfd, const char *pathname, int flags, mode_t mode);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):openat():Since glibc 2.10:_POSIX_C_SOURCE >= 200809LBefore glibc 2.10:_ATFILE_SOURCEDESCRIPTIONThe open() system call opens the file specified by pathname.  If the specified file does not exist, it may optionally (if O_CREAT is specified inflags) be created by open().
......

2. open 函数

1)open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/*./open 1.txtargc = 2argv[0] = "./open"argv[1] = "1.txt"
*/
int main(int argc, char **argv)
{int fd;if(argc != 2){printf("Usage: %s <file>\n", argv[0]);return -1;}else{printf("fd: %d\n", fd);}fd = open(argv[1], O_RDWR);if(fd < 0){printf("can not open file %s\n", argv[1]);printf("errno = %d\n", errno);printf("err: %s\n", strerror(errno));perror("open");}while(1){sleep(10);}close(fd);return 0;
}

2)create

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/*./create 1.txtargc = 2argv[0] = "./create"argv[1] = "1.txt"
*/
int main(int argc, char **argv)
{int fd;if(argc != 2){printf("Usage: %s <file>\n", argv[0]);return -1;}else{printf("fd: %d\n", fd);}// O_TRUNC: 截断,清空// 0666 : 文件权限,8进制,rwx ,6即110 可读可写// -rw-rw-r-- : owner-group-other// 注意:无法改变other用户的w权限fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0666);if(fd < 0){printf("can not open file %s\n", argv[1]);perror("open");}while(1){sleep(10);}close(fd);return 0;
}

注意:用open创建文件时设置mode权限,最终得到的文件权限为 mode & ~umask。umask命令可以查看当前用户不能获取的权限。

3. write 函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/*./write 1.txt str1 str2argc = 3  // 至少3个参数argv[0] = "./write"argv[1] = "1.txt"
*/
int main(int argc, char **argv)
{int fd,i,len;if(argc < 3){printf("Usage: %s <file> <str1> <str2>\n", argv[0]);return -1;}else{printf("fd: %d\n", fd);}fd = open(argv[1], O_RDWR | O_CREAT, 0666);if(fd < 0){printf("can not open file %s\n", argv[1]);perror("open");}for(i = 2; i < argc; i++){len = write(fd, argv[i], strlen(argv[i]));if(len != strlen(argv[i])){perror("write");break;}write(fd, "\r\n", 2);}close(fd);return 0;

可以使用lseek移动写入位置的指针,注意再写入的内容会将原位置的内容覆盖。

4. read 函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/*./read 1.txtargc = 2argv[0] = "./read"argv[1] = "1.txt"
*/
int main(int argc, char **argv)
{int fd,i,len;unsigned int buf[100];if(argc != 2){printf("Usage: %s <file>\n", argv[0]);return -1;}else{printf("fd: %d\n", fd);}fd = open(argv[1], O_RDONLY);if(fd < 0){printf("can not open file %s\n", argv[1]);perror("open");}while(1){len = read(fd, buf, sizeof(buf)-1);if(len < 0){perror("read");close(fd);return -1;}else if(len == 0) // 读到文件尾部{break;}else{buf[len-1] = '\0';printf("%s",buf);}}close(fd);return 0;
}

5 dup函数

作用:复制文件描述符,即两个文件句柄指向同一个文件描述符,这两个文件句柄共享文件偏移地址

  • dup : int dup(int oldfd);
  • dup2:int dup2(int oldfd,int newfd);
  • dup3:int dup3(int oldfd,int newfd,int flags);
    • oldfd:被复制的文件句柄
    • newfd:复制得到的文件句柄
      注意:
  • dup函数返回的文件句柄是 未使用的最小文件句柄。
  • dup2 可以指定复制得到的文件句柄为newfd。
  • dup3 跟dup2 类似,flags参数要么是0,要么是0_CLOEXEC

To Be Continue …

相关文章:

【4】DongshanPI-Seven 应用开发_文件IO

目录 1.文件IO1.1 文件IO分类1.2 查看系统调用IO用法 2. open 函数3. write 函数4. read 函数5 dup函数 1.文件IO 1.1 文件IO分类 在Linux系统中&#xff0c;一切都是“文件”&#xff1a;普通文件、驱动程序、网络通信等。所有的操作都是通过文件IO来操作的。 在Linux操作文…...

SEO 的未来:GPT 和 AI 如何改变关键词研究

谷歌Gemini与百度文心一言&#xff1a;AI训练数据的较量 介绍 想象一下&#xff0c;有一个工具不仅可以理解错综复杂的关键字网络&#xff0c;还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方&#xff0c;以我们从…...

面试八股文之JAVA基础

JAVA基础 DNS、CDN&#xff1f;如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层&#xff1f;应用层协议&#xff1f;http协议和https协议区别&#xff1f;传输层协…...

网络连接中——长连接和短连接详解

一、TCP功能 TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接。 TCP连接的建立是通过三次握手,而连接的释放是通过四次挥手。所以说,每个TCP连接的建立和释放都是需要消耗资源和时间…...

PEReDi 完全隐私的央行数字货币方案

第一个对完全隐私保护建模的方案&#xff0c;基于账户模型&#xff0c;要求交易双方都在线。 角色分类 中央银行 B B B&#xff1a;负责发行数字货币和货币政策&#xff0c;但不控制用户账户的状态&#xff0c;没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…...

yolov5+pyside6+登录+用户管理目标检测可视化源码

一、软件简介 这是基于yolov5目标检测实现的源码&#xff0c;提供了用户登录功能界面&#xff1b; 用户需要输入正确的用户名和密码才可以登录。如果是超级管理员&#xff0c;可以修改普通用户的信息&#xff0c;并且在检测界面的右上角显示【管理用户】按钮。 支持图片、视频、…...

电脑如何设置个性便签 电脑个性便签分享

每次坐在电脑前&#xff0c;我都仿佛置身于一片信息的海洋。工作、生活、学习&#xff0c;方方面面的事情都需要我用心去记录。在这样一个快节奏的时代&#xff0c;电脑无疑成了我最得力的助手。但记事的时候&#xff0c;我总希望有一个既方便又有个性的工具&#xff0c;能让我…...

备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验

备考ICA----Istio实验12—配置双向TLS Istio Ingress Gateway实验 本实验部分配置延续上个Istio实验11 1. 重新配置secret 重新配置secret使其带有ca证书可以验证客户端证书是否合法 先删除原有secret,再配置新的secret # 删除原tls类型的secret kubectl -n istio-system d…...

SpringBoot 统一后端返回格式、处理全局异常

文章目录 引言I 统一标准格式1.1 定义返回标准格式1.2 定义状态码1.3 返回数据模型1.4 枚举定义1.5 Json序列化处理1.6 获取枚举字典II 处理全局异常2.1 全局异常处理器2.2 自定义异常2.3 请求数据模型III 预备知识:注解3.1 JsonInclude3.2 JsonIgnoreProperties...

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 &#xff08;1&#xff09;cout输出流 &#xff08;2&#xff09;endl操纵符 &#xff08;3&#xff09;cin输入流 二、C表达式和控制语句 1、数据机构 特别&#xff1a;布尔类型bool 2、算数运…...

Rust 双向链表 LinkedList 和安全删除元素的方法

一、LinkedList 基本用法 在Rust中&#xff0c;LinkedList 是标准库中 std::collections 模块提供的一个双向链表实现。这个双向链表在每个节点中都保存了其前一个和后一个节点的引用&#xff0c;允许在链表的任一端进行有效的添加和移除操作。 以下是一个简单的示例&#xf…...

Android 开发中 Gradle 使用详解:构建、配置与优化技巧

文章目录 1. 基本概念2. 配置构建脚本2.1 项目级构建脚本2.2 模块级构建脚本 3. 自定义构建变体和应用 flavorDimensions4. 多模块项目4.1 创建模块4.2 配置模块依赖 5. 使用 Gradle 插件6. 使用 Gradle 命令 Gradle 是一种先进的构建工具&#xff0c;它被广泛应用于 Android 开…...

聚道云助力:易快报CDP无缝对接,登录同步一步到位!

一、客户介绍 某企业咨询有限公司是一家专注于为企业提供全方位、高质量咨询服务的领先机构。该公司致力于将先进的管理理念和实践经验与企业实际需求相结合&#xff0c;助力企业实现可持续发展。无论是战略规划、组织优化、人力资源管理&#xff0c;还是市场营销、财务管理等…...

Java解决幸运数字

Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数&#xff0c;因为(126)10 (176)8&#xff0c;(126)10…...

将一个nextjs项目部署到vercel

注&#xff1a;下面均为AI创作&#xff08;本人已验证该流程可行&#xff09; 将一个 Next.js 项目部署到 Vercel 是一个相对直接的过程&#xff0c;因为 Vercel 是由同一个团队开发的&#xff0c;专门为 Next.js 优化。以下是部署一个 Next.js 项目到 Vercel 的基本步骤&…...

RocketMQ学习笔记:分布式事务

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、分布式事务的难题2、解决方式2.1、半事务消息和事务回查2.2、代码样例2.2.1、TransactionListener2.2.2、TransactionMQProducer2.2.3、MessageListenerConcurrently2.2.4、流程图 1、分布…...

单臂路由和三层交换机

目录 一.单臂路由 1.单臂路由的工作原理 2.单臂路由的配置 2.1画出拓扑图 2.2配置PC 2.3配置交换机 2.4配置路由器 2.5测试 二.三层交换机 1.三层交换机的概述 2.三层交换机的配置 2.1画出拓扑图 2.2配置PC 2.3配置二层交换机 2.4配置三层交换机 2.5测试 3.拓展 三.总结 一.…...

红岩思维导图的制作软件,分享4款热门的!

红岩思维导图的制作软件&#xff0c;分享4款热门的&#xff01; 在当今信息爆炸的时代&#xff0c;思维导图作为一种有效的知识整理和思维拓展工具&#xff0c;受到了广大用户的青睐。红岩思维导图以其独特的风格和实用性&#xff0c;成为了许多人学习和工作中的得力助手。那么…...

es 集群开机自动启动

前面搭建了 es 集群&#xff0c;但是每次机器重启 都需要手动启动&#xff0c;很麻烦&#xff0c;所以这里介绍一下开机自动启动 首先使用 root 用户 es &#xff1a; 执行以下命令 vim /etc/init.d/elasticsearch 将以下内容 cv 进去 #!/bin/bash #chkconfig: 345 63 …...

使用JMeter从JSON响应的URL参数中提取特定值

在使用Apache JMeter进行API测试时&#xff0c;我们经常需要从JSON格式的响应中提取特定字段的值。这可以通过使用JMeter内置的JSON提取器和正则表达式提取器来完成。以下是一个具体的例子&#xff0c;展示了如何从一个JSON响应中提取rowId的值&#xff0c;同时处理字符串终止符…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...