一、系统调用的文件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个字节
- 如果被信号打断了那就
再读一遍
- 一个字节都没读到,就被信号打断,read返回-1, errno被设置成
EINTR
- 文件中有10个字节,也要读10个字节,但是读到5个字节,被信号打断,read返回5, errno被设置成
EINTR
- 文件中只有5个字节,但是要读10个字节,没有被信号打断,read返回5, 不设置errno
第3种情况,第二遍再读一遍的话,读到的是
0个字节
- 中断错误并不是很致命的错误,发生了就再读一遍,但是其他的就属于致命错误,直接
return -1
就好
4.3 read封装
4.4 read从标准输入
中读内容
- 如何从
标准输入
中读内容
因为在一个进程打开的时候,标准输入输出错误文件就打开了,所以我们不需要再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函数的文件结束标志