嵌入式Linux学习笔记之第二阶段---文件I/O
1、文件IO的四个函数
一些术语:
	  不带缓冲的I/O:
		    每个read和write都调用内核中的一个系统调用。
	  文件描述符:
		    一个非负整数,对内核而言,所以打开的文件都通过文件描述符引用。
①打开或创建一个文件 open(char *path, flag, mode) 在fcntl.h文件中声明
int openat(int fd, const char *path, int flag......)
open 与 openat的区别:①路径,path指定是绝对路径时open==openat;openat可以让线程使用相对路径名打开目录中的文件,而不再只能打开当前工作目录;
                 ②openat解决TOCTTOU问题,两个函数调用之间文件可能改变了,会造成第一个调用的结果不再有效。
		  char*:包含有文件名和路径
		  flag:打开文件的方式  O_RDONLY  O_WRONLY  O_RDWR  O_CREAT  O_EXCL(测试文件是否存在)  O_TRUNC(打开已存在文件时会清空内容)  O_APPEND(追加方式打开文件)
		  mode:创建文件的权限	真正的权限:Mode&(~umask)
  返回值:
		  成功:文件描述符,非负正整数,文件的ID号(ls -lai可以查询)
		  出错:-1  
②write(int fd, void *buf, size_t count)
		  fd:写到哪个文件
		  *buf:要写的内容
		  count:写多少字节
		  返回值:实际写的字节数
③read(int fd, void *buf, size_t count) --和write差不多
④close(int fd)
2、因为文件存在读写位置指针,所以需要lseek调整读写位置指针:
	  lseek(int fd, off_t offset, int whence),
该函数的头文件:sys/types.h unistd.h
  offset:偏移量,单位是字节的数量,可正可负
		  whence:当前位置的基点,有三个标志
			  SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
			  SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加偏移量
			  SSK_END:当前位置为文件的结尾,新位置为当前位置加偏移量
返回值:成功:文件当前的位置(新的文件偏移量) 出错:-1
允许文件构成一个空洞。(lseek和write相互作用),空洞不占用存储区。
可以 od -c +文件 以字符方式打印文件内容
2、文件共享
不同进程间共享打开文件
内核为所有打开的文件维持一张文件表(同一个文件可以被打开多次,所以同一个文件可以在文件表中占有多项)。每个文件表项包含:
(a)、文件状态标志(读、写、添写、同步和非阻塞等)
(b)、当前文件偏移量(不同的进程当前的文件偏移量是不同的,你想两个不同的进程对同一个文件的操作可能都不一样,那当然文件偏移量是不一样的)
(c)、指向该文件的V节点表项的指针。
  
3、原子操作
比如open函数的O_CREAT和O_EXCL。
函数pread和pwrite(先调用lseek后调用read或者write)
追加数据到一个文件的O_APPEND
4、函数dup和dup2:复制一个现有的文件描述符
#include <unistd.h>
int dup(int fd)
int dup2(int fd, int fd2)
5、函数sync、fsync和fdatasync:向文件写入数据时,内核先把数据复制到缓冲区中,然后排入队列,晚些再写入磁盘。
  #include <unistd.h>
  int fsync(int fd)  对指定的文件起作用,等待写磁盘操作结束才返回
int fdatasync(int fd)
int sync(void) 把快缓冲区写入队列,不等待实际写磁盘操作结束,并立即返回
6、函数fcntl:可以改变已经打开文件的属性
#include <fcntl.h>
int fcntl(int fd, int cmd, ...)
https://www.cnblogs.com/xuyh/p/3273082.html
7、函数ioctl
#include <unistd.h>
#include <sys/ioctl.h>
int ioctl(int fd, int request, ...)
I/O操作的杂物箱
https://www.cnblogs.com/kunhu/p/3606427.html
嵌入式Linux学习笔记之第二阶段---文件I/O的更多相关文章
- 嵌入式Linux学习笔记之第一阶段---基础篇
		嵌入式Linux学习分五个阶段 第一阶段: 01嵌入式环境搭建初期 02C语言语法概述 03C语言内存操作 04c语言函数 05linux基础 06gun基础 第二阶段: 01-linux之io系统编 ... 
- 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
		在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ... 
- 【转】嵌入式Linux学习笔记
		一 嵌入式系统定义: 应用于特定环境的硬件体系. 二 两样非常重要的能力: 1. 掌握各种新概念的能力 2. 调试的能力( 包括软件, 硬件 ) 三 需要的基础知识: 1. 操作系统理论基 ... 
- 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现
		目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ... 
- 嵌入式Linux学习笔记(0)基础命令。——Arvin
		学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ... 
- Linux学习笔记之1——文件和目录管理(硬连接和软连接)(连结档,相当于快捷方式)
		在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ... 
- Linux学习笔记 -- 目录与文件的管理
		目录结构 Linux的目录结构为树状结构,最顶级的目录为根目录 “/”. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是. 绝对路径与相对路径 绝 ... 
- 嵌入式Linux学习笔记 NAND Flash控制器
		一.NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Fla ... 
- 【linux学习笔记四】文件搜索命令
		一 文件搜索 locate //在后台数据库中按文件名搜索 搜索速度更快 locate 文件名 //locate命令所搜索的后台数据库 /var/lib/mlocate //更新数据库 updated ... 
随机推荐
- 在Kaggle免费使用GPU训练自己的神经网络
			Kaggle上有免费供大家使用的GPU计算资源,本文教你如何使用它来训练自己的神经网络. Kaggle是什么 Kaggle是一个数据建模和数据分析竞赛平台.企业和研究者可在其上发布数据,统计学者和数据 ... 
- Win10安装PyQt5与Qt Designer【转】
			https://blog.csdn.net/u011342224/article/details/78879633 1.直接在cmd中通过pip安装PyQt5 1 pip install pyqt5 ... 
- CMU Advanced DB System - Query Optimizer
			Overview Optimizer模块所处在的位置如图, 那么做optimize的目的是, 找出所有‘correct’执行计划中‘cost’最低的 那么这里首先要明确的概念,‘correct’,关系 ... 
- C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)
			转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多 ... 
- face morhper
			图像变形背后的想法很简单.给定两个图像,我们想通过将图像和混合来创建中间图像.图像的混合和由参数控制的是在0和1之间().当为0时,变形看起来像,而当为1 时,变形看起来像.天真的,您可以在每个像素上 ... 
- ionic4 路由跳转、ionic4 路由跳转传值 NavController 返回上一页 、NavController 回到根
			1.普通路由跳转 <ion-button [routerLink]="['/pinfo']"> 跳转到详情 </ion-button> <ion-he ... 
- Spring cloud微服务安全实战-4-3常见的微服务安全整体架构
			整体架构 这个图适合中小公司.麻雀虽小 五脏俱全.微服务架构所需要做的事在这个图里基本都有了. 绿色的不讲,主要讲的是这三块(橘黄色的).后面的和运维相关,会讲,不会讲的太深 订单服务 首先来写一个订 ... 
- 转:HR schema
			###createe RemRem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $RemRem hr_cre.sqlRemRem Copyrig ... 
- GWAS: 网页版的基因型填充(genotype imputation)
			在全基因组关联分析中,处理芯片数据时,必须走的一个流程就是基因型数据填充(imputation). 当然,如果你拿到的是全测序的数据,请忽略这一步. 下面直奔主题,怎么在网页版进行基因型填充. 1 进 ... 
- Python第一阶段04
			1.文件操作: # 指明编码 f = open("sisi", encoding="utf-8") # 读 data = f.read() print(data ... 
