I/O模型
- Unix系统I/O模型最为显著的的特征之一是其I/O通用性概念。也就是说,同一套系统调用(open()、read()、write()、close()等)所执行的I/O操作,可以施之于所有文件类型,包括设备文件在内(应用程序发起的I/O请求,内核会将其转化为相应的文件系统操作,或者设备驱动程序操作,以此来针对模板文件或者设备I/O操作)。因此,采用这些系统调用的程序能够处理任何类型文件
- 就本质而言,内核值提供一种文件系统:文件流序列,在处理磁盘文件、磁盘或者磁带设备时,可以通过lseek()系统调用来随机访问
- 许多应用程序和函数库都将换行符(十进制 ASCII 码为 10)视为文件中一行的结束和另一行的开始。Unix中没有文件结束符的概念,读取文件时如无数据返回,就会认为到达文件末尾
文件描述符
I/O系统调用使用文件描述符—数值很小的非负整数----来指代打开的文件。获取文件描述符的常用手法是调用 open(),在参数中指定 I/O 操作目标文件的路径名。
通常,由shell启动的进程会继承三个已打开的文件描述符
- 描述符 0 为标准输入,指代为进程提供输入的文件
- 描述符 1 为标准输出,指代供进程写入输出的文件
- 描述符 2 为标准错误,指代供进程写入错误消息或异常通告的文件。
在交互式shell或者程序中,上面三者一般都指向终端。在 stdio 函数库中,这几种描述符分别与文件流 stdin、stdout 和 stderr 相对应
stdio函数库
- C编程语言在执行I.O操作时,往往会调用C标准库的I/O函数。也将这样一组I/O函数称为stdio函数库,其中包含括 fopen()、fclose()、scanf()、printf()、fgets()、fputs()等
- stdio函数位于I/O函数调用层(open()、close()、read()、write()等)之上