文件IO函数

news2024/11/19 1:21:03

目录

通用IO模型:open、read、write、lseek、close

举例1

举例2

非通用函数:ioctl/mmap

mmap

ioctl

函数用法帮助命令

help

man

info

系统调用函数怎么进入内核?

内核的sys_open、sys_read会做什么?


通用IO模型:open、read、write、lseek、close

举例1

#include <stdio.h>
#include <sys/types.h>	// open
#include <sys/stat.h>	// open
#include <fcntl.h>		// O_RDONLY...
#include <unistd.h>		// close

/*
* ./read 1.txt
* argc = 2
* argv[0] = "./copy"
* argv[1] = "1.txt"
*/
int main(int argc, char **argv)
{
	int fd = open(argv[1], O_RDONLY);
	if(fd == -1)
	{
		printf("open error\n");
		return -1;
	}

	char buf[3] = {0};
	int ret;

	ret = read(fd, buf, 3);
	printf("buf = %s\n", buf);
	printf("ret = %d\n", ret);
	//指针自动会移动,会从第四个字符开始读取文件内容
	ret = read(fd, buf, 3);
	printf("buf = %s\n", buf);
	printf("ret = %d\n", ret);

	close(fd);
	
	return 0;
}

举例2

#include <stdio.h>
#include <sys/types.h>	// open
#include <sys/stat.h>	// open
#include <fcntl.h>		// O_CREAT...
#include <unistd.h>		// close

/*
* ./copy 1.txt 2.txt
* argc = 3
* argv[0] = "./copy"
* argv[1] = "1.txt"
* argv[2] = "2.txt"
*/
int main(int argc, char **argv)
{
	int fd_old, fd_new;
	char buf[1024];
	int len;

	/* 1. 判断参数 */
	if (argc != 3)
	{
		printf("Usage: %s <old-file> <new-file>\n", argv[0]);
		return -1;
	}
	
	/* 2. 打开老文件 */
	fd_old = open(argv[1], O_RDONLY);
	if (fd_old == -1)
	{
		printf("can not open file %s\n", argv[1]);
		return -1;
	}
	
	/* 3. 创建新文件 */
	fd_new = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
	if (fd_new == -1)
	{
		printf("can not creat file %s\n", argv[2]);
		return -1;
	}
	
	/* 4. 循环: 读老文件-写新文件 */
	while ((len = read(fd_old, buf, 1024)) > 0)
	{
		if (write(fd_new, buf, len) != len)
		{
			printf("can not write %s\n", argv[2]);
			return -1;
		}
	}
	
	/* 5. 关闭文件 */
	close(fd_old);
	close(fd_new);
	
	return 0;
}

非通用函数:ioctl/mmap

mmap

在Linux中,还可以把一个文件的所有内容映射到内存,然后直接读写内存就可以读写文件。

mmap:memory map,内存映射。将一个文件或其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。

实现这种映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面(有修改过的页面)到对应的文件磁盘上,即完成了对文件的操作而不必再调用read、write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

/*
* ./copy 1.txt 2.txt
* argc = 3
* argv[0] = "./copy"
* argv[1] = "1.txt"
* argv[2] = "2.txt"
*/
int main(int argc, char **argv)
{
	int fd_old, fd_new;
	struct stat stat;
	char *buf;

	/* 1. 判断参数 */
	if (argc != 3)
	{
		printf("Usage: %s <old-file> <new-file>\n", argv[0]);
		return -1;
	}
	
	/* 2. 打开老文件 */
	fd_old = open(argv[1], O_RDONLY);
	if (fd_old == -1)
	{
		printf("can not open file %s\n", argv[1]);
		return -1;
	}

	/* 3. 确定老文件的大小 */
	if (fstat(fd_old, &stat) == -1)
	{
		printf("can not get stat of file %s\n", argv[1]);
		return -1;
	}

	/* 4. 映射老文件 */
	buf = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd_old, 0);
	if (buf == MAP_FAILED)
	{
		printf("can not mmap file %s\n", argv[1]);
		return -1;
	}

	/* 5. 创建新文件 */
	fd_new = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
	if (fd_new == -1)
	{
		printf("can not creat file %s\n", argv[2]);
		return -1;
	}

	/* 6. 写新文件 */
	if (write(fd_new, buf, stat.st_size) != stat.st_size)
	{
		printf("can not write %s\n", argv[2]);
		return -1;
	}

	/* 5. 关闭文件 */
	close(fd_old);
	close(fd_new);

	return 0;
}

ioctl

函数用法帮助命令

help

help只能用于查看某个命令的用法。比如:

ls --help

man

man手册既可以查看命令的用法,也可以查看函数的详细介绍等。man手册分九大类。

类别描述
Executable programs or shell commandsshell命令或可执行程序
System calls(functions provided by the kernel)系统调用(内核提供的函数),比如man 2 open
Library calls(functions within program libraries)函数库调用(函数库的函数)

Special files(usually found in /dev)

特殊文件(通常在/dev中找到),比如man 4 tty
File formats and conventions eg /etc/passwd文件格式和约定,比如man 5 passwd
Games游戏

Miscellaneous(including macro packages and conventions),e.g. man(7),groff(7)

杂项(包括宏包和约定)
System administration commands(usually only for root)系统管理命令(通常只有root)
Kernel routines [Non standard]内核例程

比如想查看open函数的用法时,可以直接执行“man open”,发现这不是想要的内容时再执行“man 2 open”。

在man命令中可以按“h”查看帮助信息了解快捷键。常用的快捷键如下:

f                往前翻一页

b               往后翻一页

/patten      往前搜

?patten     往后搜

info

info手册比man手册编写得更全面,但man手册使用起来容易。

可以直接执行“info”命令,按“H”快捷键查看帮助信息了解快捷键。常用的快捷键如下:

系统调用函数怎么进入内核?

以open/read为例,从用户态调用API触发异常进入内核的过程如上图所示。最后调用的sys_call_table的函数指针数组如下:

CALL(sys_restart_syscall)           /* 0 */

CALL(sys_exit)

CALL(sys_fork)

CALL(sys_read)

CALL(sys_write)

CALL(sys_open)                          /* 5 */

CALL(sys_close)

CALL(sys_ni_syscall)

CALL(sys_creat)

CALL(sys_link)

CALL(sys_unlink)                       /* 10 */

CALL(sys_execve)

CALL(sys_chdir)

CALL(OBSULETE(sys_time))

内核的sys_open、sys_read会做什么?

进入内核后,sys_read/open会首先根据参数判断文件的类型,然后根据不同的文件类型去找不同的设备驱动,继而进行读写或输入输出控制。

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

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

相关文章

FUXA入门教程

通过docker安装fuxa后&#xff1a; 打开后的界面如下&#xff1a; 完整配置如下&#xff1a; MQTT驱动演示

C++三大特性——继承(上篇)

文章目录 目录 一、继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 一、继承的概念及定义 1.1继承的概念 继承(inherita…

【消费战略方法论】消费烙印的策略模型

消费烙印策略模型 消费烙印策略&#xff0c;以消费者认知为导向&#xff0c;以品牌核心价值为中心&#xff0c;建立统一、高效、落地的品牌系统闭环&#xff0c;通过极致烙印方法(定位语言烙印、视觉烙印、产品烙印)让品牌价值烙印深植消费者心智。 消费烙印的对象是消费者&a…

QQ浏览器怎么才能设置默认搜索引擎为百度

问题&#xff1a; 打开QQ浏览器&#xff0c;搜索相关信息时发现总是默认为”搜狗搜索引擎“&#xff0c;想将其转为”百度搜索引擎“ 解决&#xff1a; 1、点击浏览器右侧”菜单“图标&#xff0c;选择”设置“&#xff0c;如下图所示&#xff1a; 2、在”常规设置“中的”搜…

一篇概全,接口测试知识盲扫,真正的接口测试是如何做的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试的基本…

基于虚幻引擎的AI训练合成数据生成

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 近年来&#xff0c;合成数据生成&#xff08;Synthetic Data Generation&#xff09;已成为手动收集和注释数据集的替代方法。 数据合成器的优点主要有两个。 首先&#xff0c;它使获取数据的成本几乎为零&#xff0c;同时…

Java读取Excel内容,最后获得一个list对象

代码层 public R importPackage(MultipartFile multipartFile) {try {log.info("multipartFile " multipartFile);log.info("ContentType " multipartFile.getContentType());log.info("OriginalFilename " multipartFile.getOriginalFil…

基于 FPGA 的机器博弈五子棋游戏

基于 FPGA 的机器博弈五子棋游戏 一,设计目的 五子棋是一种深受大众喜爱的游戏,其规则简单,变化多端,非常富有趣味性 和消遣性。棋类游戏在具备娱乐性、益智性的同时也因为其载体大多是手机, 电脑等移动互联网设备导致现代社会低头族等现象更加严重,危害青少年的身 体健康…

VR全景展示带来旅游新体验,助力旅游业发展!

引言&#xff1a; VR&#xff08;虚拟现实&#xff09;技术正以惊人的速度改变着各行各业&#xff0c;在旅游业中&#xff0c;VR全景展示也展现了其惊人的影响力&#xff0c;为景区带来了全新的宣传机会和游客体验。 一&#xff0e;什么是VR全景展示&#xff1f; VR全景展示是…

科创人·TATA木门CIO乐勇斌:数字化变革大坎儿在组织变革,天再冷也要拥抱智能

乐勇斌 TATA木门信息中心总监 10年信息化领域管理咨询经验&#xff0c;熟悉零售、电商、汽车、医药、制造、机械加工、家居制造等行业信息化规划、解决方案、建设和流程落地&#xff1b;具备跨区域、项目集和项目组合管控能力&#xff0c;擅于集团化产供销一体化规划&#xff…

【Vue基础-数字大屏】自定义主题

一、apache主题模板 链接https://echarts.apache.org/zh/download-theme.html 二、操作步骤 1、在apache主题模板中定制所需要的主题&#xff0c;如下图点击下载&#xff0c;复制其json 2、回到项目代码&#xff0c;在assets目录下新建index.js文件&#xff0c;新建变量&…

(三)行为模式:8、状态模式(State Pattern)(C++示例)

目录 1、状态模式&#xff08;State Pattern&#xff09;含义 2、状态模式的UML图学习 3、状态模式的应用场景 4、状态模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现状态模式的实例 1、状态模式&#xff08;State Pattern&#x…

【STM32单片机】俄罗斯方块游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示俄罗斯方块游戏界面并开始游戏&#xff0c;KEY1键用于方块方向旋转&…

【交互式阈值二进制图像】采用彩色或单色图像通过交互/手动方式阈值单色图像或彩色图像的单个色带研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出&#xff1b; win32 api的声明如下&#xff1b; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…

论文分享 | 利用单模态自监督学习实现多模态AVSR

本次分享上海交通大学发表在 ACL 2022 会议 的论文《Leveraging Unimodal Self-Supervised Learning for Multimodal AVSR》。该论文利用大规模单模态自监督学习构建多模态语音识别模型。 论文地址&#xff1a; https://aclanthology.org/2022.acl-long.308.pdf 代码仓库&am…

ACM模板修改

修改为匿名版本 将 \documentclass[sigconf,authordraft]{acmart} 改为 \documentclass[sigconf,review,anonymous]{acmart} 去掉模板中的无用段落 添加如下语句删除上述段落 \renewcommand\footnotetextcopyrightpermission[1]{} 添加如下语句删除上述段落 \settopmatter…

2019款保时捷卡宴车发动机故障灯异常点亮

故障现象 一辆2019款保时捷卡宴车&#xff0c;搭载DCB发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;该车行驶中发动机故障灯偶尔异常点亮&#xff08;图1&#xff09;&#xff0c;其他无异常&#xff0c;为此在其他维修厂更换过燃油箱通风电磁阀、活性炭罐及…

品牌举办活动如何提高知名度?媒介盒子告诉你

2023年&#xff0c;线下消费端口迎来了迅猛爆发&#xff0c;多数行业进入“复苏反攻”状态之中&#xff0c;但在生活节奏加快&#xff0c;信息碎片化趋势之下&#xff0c;大众的注意力成为稀缺资源&#xff0c;逐渐趋同的套路式营销很难打动人心&#xff0c;对于品牌来说&#…

python3多线程处理文件

问题 现在需要对某个文本中的每一条进行处理&#xff0c;例如&#xff1a;对每一行进行同样的操作&#xff0c;现在采用多线程进行&#xff0c;而不是一条一条读取、执行 解决 #! /usr/bin/env python # encoding:utf-8 # Software:PyCharm # Time:2023/10/07 14:30 # Auth…