美文网首页
3. linux中的文件 IO

3. linux中的文件 IO

作者: 辉神来了 | 来源:发表于2019-08-09 13:09 被阅读0次
open函数的flag详解
读写权限:O_RDONLY O_WRONLY O_RDWR
  • linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明(譬如O_RDONLY就表示以只读方式打开,O_WRONLY表示以只写方式打开,O_RDWR表示以可读可写方式打开)
  • 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
打开存在并有内容的文件时:O_APPEND、O_TRUNC
  • 思考一个问题:当我们打开一个已经存在并且内部有内容的文件时会怎么样?
    可能结果1:新内容会替代原来的内容(原来的内容就不见了,丢了)
    可能结果2:新内容添加在前面,原来的内容继续在后面
    可能结果3:新内容附加在后面,原来的内容还在前面
    可能结果4:不读不写的时候,原来的文件中的内容保持不变
  • O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,则原来的内容会被丢弃。这就对应上面的结果1
  • O_APPEND属性去打开文件时,如果这个文件中本来是有内容的,则新写入的内容会接续到原来内容的后面,对应结果3
  • 默认不使用O_APPEND和O_TRUNC属性时就是结果4
  • 如果O_APPEND和O_TRUNC同时出现会怎么样? O_TRUNC 有作用
exit、_exit、_Exit退出进程
  • 当我们程序在前面步骤操作失败导致后面的操作都没有可能进行下去时,应该在前面的错误监测中结束整个程序,不应该继续让程序运行下去了。
  • 我们如何退出程序?
    第一种;在main用return,一般原则是程序正常终止return 0,如果程序异常终止则return -1。
    第一种:正式终止进程(程序)应该使用exit或者_exit或者_Exit之一。
打开不存在的文件时:O_CREATE 、O_EXCL
  • 思考:当我们去打开一个并不存在的文件时会怎么样? 当我们open打开一个文件时如果这个文件名不存在则会打开文件错误
  • vi或者windows下的notepad++,都可以直接打开一个尚未存在的文件
  • open 的flag O_CREATE 就是为了应对这种打开一个并不存在的文件,O_CREATE 就表示我们当前打开的文件并不存在,我们是要去创建并且打开它
  • 思考: 当我们open使用了O_CREATE ,但是文件已经存在的情况下会怎么样?
  • 结论: open中加入O_CREATE 后, 不管原来这个文件存在与否都能打开成功,如果原来这个文件不存在则创建一个空的新文件,如果原来 这个文件存在则会重新创建这个文件,原来的内容会被消除掉(有点类似先删除原来的文件再创建一个新的 )
  • 这样可能带来一个问题? 我们本来想去创建一个新文件的,但是把文件名搞错了弄成了一个老文件名,结果老文件就被意外修改了。我们希望的效果是:如果我CREATE要创建的是一个已经存在的名字的文件,则给我报错,不要去创建
  • 这个效果就是要靠O_EXCL 和 O_CREATE 标志来结合使用。当这两个标志一起时,则没有文件时创建文件,有这个文件时会报错提醒我们
  • open 函数在使用O_CREATE 标志去创建文件时,可以使用第三个参数 model 来指定要创建的文件的权限 , model使用4个数字来指定权限的,其中后面三个很重要,对应我们要创建的这个文件的权限标志。譬如说一般创建一个可读可写不可执行的文件就用 0666
O_NONBLOCK
  • 阻塞与非阻塞。如果一个函数是阻塞式的,则我们调用这个函数时当前进程有可能被卡住(阻塞住,实质是这个函数内部要完成的事情条件不具备,当前没法做,要等待条件成熟),函数被阻塞住了就不能立刻返回;如果一个函数是非阻塞式的那么我们调用这个函数后一定会立即返回,但是函数有没有完成任务不一定。
  • 阻塞和非阻塞是两种不同的设计思路,并没有好坏。总的来说,阻塞式的结果有保障但是时间没保障;非阻塞式的时间有保障但是结果没保障。
  • 操作系统提供的API和由API封装而成的库函数,有很多本身就是被设计为阻塞式或者非阻塞式的,所以我们应用程度调用这些函数的时候心里得非常清楚。
  • 我们打开一个文件默认就是阻塞式的,如果你希望以非阻塞的方式打开文件,则flag中要加O_NONBLOCK标志。
  • 只用于设备文件,而不用于普通文件。
O_SYNC
  • write阻塞等待底层完成写入才返回到应用层。
  • 无O_SYNC时write只是将内容写入底层缓冲区即可返回,然后底层(操作系统中负责实现open、write这些操作的那些代码,也包含OS中读写硬盘等底层硬件的代码)在合适的时候会将buf中的内容一次性的同步到硬盘中。这种设计是为了提升硬件操作的性能和销量,提升硬件寿命;但是有时候我们希望硬件不要等待,直接将我们的内容写入硬盘中,这时候就可以用O_SYNC标志。

相关文章

  • Linux 文件IO 和 标准IO

    [TOC] Linux 文件IO 和 标准IO Linux 文件IO Linux中做文件IO最常用到的5个函数是:...

  • 3. linux中的文件 IO

    open函数的flag详解 读写权限:O_RDONLY O_WRONLY O_RDWR linux中文件有读写权限...

  • Linux编程学习笔记 | Linux IO学习[2] - 标准

    在上一篇Linux编程学习笔记 | Linux IO学习[1] - 文件IO中,我总结了Linux下的文件IO。文...

  • 浅析 Linux 文件 IO 读写

    浅析 Linux 文件 IO 读写 Linux的文件IO子系统是Linux中最复杂的一个子系统(没有之一)。读者可...

  • Linux 文件IO

    在linux中一切皆文件。1、creat 2、open 3、close 4、read 5、write 6、lsee...

  • Linux 高级IO

    [TOC] Linux 高级IO 涉及到一些IO的高级用法 文件描述符重定向 dup 函数从当前可用的文件描述符中...

  • 2019-06-16 IO文件操作---C语言

    Linux下普通IO文件操作---C语言 普通文件IO总结 FILE结构体 打开文件fopen函数 文件指针名=f...

  • Linux学习笔记 -- 03 主机规划与磁盘分区

    1.各个硬件设备在Linux中的文件名 常见的设备在Linux中的文件名如下: 2.磁盘分区 3.安装Linux前...

  • Golang I/O笔记

    1. 基础 2. 结构体输出 3. 基本的IO接口 命令行读取输入 文件中读取 缓冲IO 统计文件行数 二进制文件...

  • Itop4412学习笔记(2)

    ​ 今天学习的是文件IO的操作,需要记录的点: 1.库函数头文件 ​ 在所有Linux系统中,对文件的操作...

网友评论

      本文标题:3. linux中的文件 IO

      本文链接:https://www.haomeiwen.com/subject/yowcjctx.html