在 C 中有 fread、fwrite 等读写文件的库函数,Linux 系统也提供了操作文件的系统调用。
fopen、fclose、fread、fwrite 都是 C 标准库中的函数,libc。
Linux 中关于文件 IO 的系统调用:open、close、read、write、lseek。
注意缓冲策略:
write 无缓冲,printf 行缓冲。
常见缓冲策略:
无缓冲
例如:write 系统调用
行缓冲:遇到 \n 就刷新,或者缓冲区满才刷新,或者手动花心(fflush)
例如:打印到显示器
全缓冲:一直到缓冲区满才刷新,或者手动刷新
例如:输出到文件
文件描述符 fd
Linux 上一个进程运行了后,默认打开三个文件:stdin、stdout、stderr。
用什么来确定这三个文件在哪里呢?或者说如果我要从键盘读入一些东西,应该从哪个文件读呢?
文件描述符、文件描述符表。
文件描述符表是一个指针数组,每一个元素都是一个 file* 指针,指向一个已经打开的文件。
文件描述符是这个指针数组的下标,所以只要拿着文件描述符,就可以找到对应的文件。
我在网上看到别人说在 Linux 内核中并不是简单的数组下标,是通过 hash 计算出来的,咱现在也不懂,后面看到了再补充。
文件描述符分配规则
1 |
|
文件描述符分配规则:在数组中找到当前没有被使用的最小的下标,作为新的文件描述符。
open
man open:
1 | SYNOPSIS |
参数
pathname:要打开或创建的目标文件
flags:打开文件时,可以传入多个参数选项(位图的方式),用下面的一个或者多个常量进行”或”运算,构成 flags。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读,写打开
上面这三个常量,必须指定并且只能指定一个。
O_CREAT 若文件不存在,则创建。需要使用 mode 选项来指明新文件的访问权限。
O_APPEND 追加写
返回值
成功:新打开的文件描述符
失败:-1
栗子
1 |
|