文件I/O常用函数
- open 打开或创建一个文件
- create 创建一个新文件
- read 从打开文件中读取数据
- write 向打开文件中写入数据
- lseek 显示设置文件的偏移量
- close 关闭一个文件
文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用,它是一个非负数,打开或新建文件时内核向进程返回一个文件描述符,当读写一个文件时,使用oepn或create返回文件描述符标识文件,并将其作为参数传给read或write。
I/O的效率
缓冲区超过磁盘块长度后对效率基本没有影响,文件系统通常采用预读(read ahead)来改善性能。
文件共享
内核使用3种数据结构表示打开文件
- 每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,包括文件描述符标志和指向一个文件表项的指针
- 内核为所有打开文件维持一张文件表,包括文件状态标志,当前文件偏移量,指向该文件v节点表项的指针
- 每个打开的文件都有一个v节点(v-node),包含文件类型和次文件进程各种操作函数指针,对于大多数文件而言v-node还包含了i节点(i-node,索引节点)。
原子操作
任何一个多于一个函数调用的操作都不是原子操作,因为两个函数调用之间,内核可能会临时挂起进程。
标准I/O
对于标准I/O库,它们的操作围绕的是流(stream)进行的,它提供缓冲以尽可能减少使用read和write的调用次数,通常提供以下3种缓冲类型:
- 全缓冲 填满标准I/O缓冲区才进行实际的I/O,在一个流上执行第一次I/O操作时通常使用malloc获得使用的缓冲区
- 行缓冲 输入和输出遇到换行符或者填满了一个缓冲区时进行I/O操作
- 不带缓冲 标准I/O不对字符进行缓冲存储,标准错误流stderr通常也是不带缓冲的,因为需要尽快显示出来