美文网首页
Linux系统编程(open, read, write)

Linux系统编程(open, read, write)

作者: StevenHD | 来源:发表于2020-12-06 00:18 被阅读0次
大纲

一、系统调用的文件IO

  • 系统的文件IO和C标准的IO的不同
图解大纲
C标准的在用户空间,系统调用的在内核空间
C标准的文件IO将数据存储在一个8K大小的缓冲区中,FILE结构体中有一个buffer指针刚好指向这个8K大小的缓冲区,FILE结构体中还有文件描述符fd

内核空间有驱动,比如磁盘驱动,鼠标驱动来使用硬件
FD是一个非负整数

用户空间是每个进程都有的,内核空间是公用的
flush可以刷新缓冲区

二、open()函数

  • 其实对于open()等系统调用,内核中也是有一个缓冲区的——
图解
  • 代码——
代码图示
  • perror是可以打印出对应错误信息

  • 软连接——

图解

log3是已有的文件,log4是新建的文件

  • 阻塞地读——

cat命令


  • errno——
    错误返回值,文件操作错误对应的错误码

  • flags

open函数的第二个参数


三、系统调用的open与creat

  • close()很重要,C标准中,不调用close,数据就会在缓冲区中,调用close后,数据才会被写到对应文件中。但是系统调用中,是可以不用手动调用close(fd)来关闭文件描述符的

标准输入,标准输出,标准错误,都是3个文件

  • creat()也能打开文件,不过都是之前没有创建的文件
  • sprintf()函数
  • umask,权限掩码, 0777, 0764
  • chmod a-x
  • ulimit -a, ulimit -n 2048

四、read()函数

4.1 基本概念

  • /0是只有字符串的结尾才会有
  • 换行是文件结束后,会添加的一个字节,所以如果一个文件中有10个字节,通过read()读出来会有11个字节

EAGAIN是read()函数返回的错误码之一
EINTR——正在读的时候被一个信号打断了,会返回这个错误值EINTR

4.2 read过程中被信号打断

  • 文件里面只有5个字节
  • 如果被信号打断了那就再读一遍
  1. 一个字节都没读到,就被信号打断,read返回-1, errno被设置成EINTR
  2. 文件中有10个字节,也要读10个字节,但是读到5个字节,被信号打断,read返回5, errno被设置成EINTR
  3. 文件中只有5个字节,但是要读10个字节,没有被信号打断,read返回5, 不设置errno

第3种情况,第二遍再读一遍的话,读到的是0个字节

  • 中断错误并不是很致命的错误,发生了就再读一遍,但是其他的就属于致命错误,直接return -1就好

4.3 read封装

4.4 read从标准输入读内容

  • 如何从标准输入读内容
    图片.png

因为在一个进程打开的时候,标准输入输出错误文件就打开了,所以我们不需要再open操作,直接read就可以
标准输入阻塞地去读,有2种方式可以来结束读取——

  • 第一种是回车,这样会多读取一个字节,什么都不输入的话,就是0个字节。
  • 第二种是ctrl + d,这样就不会多一个字节,什么都不输入的话,就是0个字节。

五、write()系统调用

5.1 文件写

  • 如果我们的选项只是O_WRONLY,那么当一个文件log中有内容的时候,再write一次,那么第二次写的内容会覆盖之前的内容。如果想要追加在后面,还需要加一个O_APPEND选项。

5.2 write()返回的错误码

  • EBADF,write()函数中,写成只读操作O_RDONLY
  • EPIPE,当读端关闭的时候,一直往管道中写,会把管道撑爆
  • EINTR, 也会跟read一样出现被信号打断的情况,所以对write要进行封装——

write的封装——


  • 0可以作为read函数的文件结束标志,但是不能作为write函数的文件结束标志

5.3 write()写标准输出、标准错误

写标准输出
标准错误
结果

相关文章

网友评论

      本文标题:Linux系统编程(open, read, write)

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