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的更多相关文章

  1. 嵌入式Linux学习笔记之第一阶段---基础篇

    嵌入式Linux学习分五个阶段 第一阶段: 01嵌入式环境搭建初期 02C语言语法概述 03C语言内存操作 04c语言函数 05linux基础 06gun基础 第二阶段: 01-linux之io系统编 ...

  2. 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发

    在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...

  3. 【转】嵌入式Linux学习笔记

    一  嵌入式系统定义: 应用于特定环境的硬件体系. 二  两样非常重要的能力: 1.  掌握各种新概念的能力 2.  调试的能力( 包括软件, 硬件 ) 三  需要的基础知识: 1.  操作系统理论基 ...

  4. 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现

    目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...

  5. 嵌入式Linux学习笔记(0)基础命令。——Arvin

    学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...

  6. Linux学习笔记之1——文件和目录管理(硬连接和软连接)(连结档,相当于快捷方式)

    在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ...

  7. Linux学习笔记 -- 目录与文件的管理

    目录结构 Linux的目录结构为树状结构,最顶级的目录为根目录 “/”. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是. 绝对路径与相对路径 绝 ...

  8. 嵌入式Linux学习笔记 NAND Flash控制器

    一.NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Fla ...

  9. 【linux学习笔记四】文件搜索命令

    一 文件搜索 locate //在后台数据库中按文件名搜索 搜索速度更快 locate 文件名 //locate命令所搜索的后台数据库 /var/lib/mlocate //更新数据库 updated ...

随机推荐

  1. 第十五周助教工作总结——NWNU李泓毅

    助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目需求改进与系统设计:https://www.cnblogs.com/nwnu-daizh/p/ ...

  2. laravel删除文件

    laravel删除文件 一.总结 一句话总结: 1.注意disk:disk决定路径 2.删单个文件的时候就用删单个文件的方式,别用删多个文件的方式(也就是参数别数组) public function ...

  3. 【转】Android检查手机是否被root

    目前来说Android平台并没有提供能够root检查的工具.但是我们可以通过两种方式来判断 手机里面是否有su文件 这个su文件是不是能够执行 但是这两种检查方式都存在缺点. 第一种存在误测和漏测的情 ...

  4. oracle 删除某个用户下的所有对象

    先存放好dropobj.sql 文件 然后登录需要删除的用户 删除前最好备份一下:(备份是在cmd中进行的) C:\Users\panfu>exp file=d:\expall.dmp log= ...

  5. 大数据/NoSQL经典电子书pdf下载

    Hadoop系列 Cloudera出品的各种官方文档 入门必备 https://www.cloudera.com/documentation.html Cloudera Hadoop大数据平台实战指南 ...

  6. ln bug

    /home/hdp/testcpy sudo ln -s . /usr/lib/cpy390sourcecode cpy390sourcecode -> . sudo ln -s pwd /us ...

  7. Visual Studio 2019更新到16.1.4

    Visual Studio 2019更新到16.1.4 此次更新仍然是修复bug为主,涉及到Xcode 11无法启动模拟器.Xamarin.Android SDK 9.3.0.23的调试bug.

  8. CentOS 7 yum Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile

    yum install nginx发生的错误 yum install nginx Loaded plugins: fastestmirror, ovl Loading mirror speeds fr ...

  9. Ionic app IOS 在Xcode 模拟运行 真机调试

    1. 创建项目: sudo ionic start myApp tabs 2 cd 到刚才创建的项目 3. sudo ionic cordova platform add ios 把 ios 环境添加 ...

  10. openresty开发系列10--openresty的简单介绍及安装

    openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏 ...