IO

文件I/O

Posted by Bug1024 on August 12, 2017

文件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通常也是不带缓冲的,因为需要尽快显示出来