1、C标准I/O库函数
先看看C标准I/O库函数是如何用系统调用实现的。
fopen(3)
调用open(2)打开指定的文件,返回一个文件描述符(就是一个int类型的编号),分配一个FILE结构体,其中包含该文件的描述符、 I/O缓冲区和当前读写位置等信息,返回这个FILE结构体的地址。
fgetc(3)
通过传入的FILE *参数找到该文件的描述符、 I/O缓冲区和当前读写位置,判断能否从I/O缓冲区中读到下一个字符,如果能读到就直接返回该字符,否则调用read(2),把文件描述符传进去,让内核读取该文件的数据到I/O缓冲区,然后返回下一个字符。
这里,对于C标准I/O库来说,打开的文件由FILE *指针标识,而对于内核来说,打开的文件由文件描述符标识,文件描述符从open系统调用获得,在使用read、 write、 close系统调用时都需要传文件描述符。
fputc(3)
判断该文件的I/O缓冲区是否有空间再存放一个字符,如果有空间则直接保存在I/O缓冲区中并返回,如果I/O缓冲区已满就调用write(2),让内核把I/O缓冲区的内容写回文件。
fclose(3)
如果I/O缓冲区中还有数据没写回文件,就调用write(2)写回文件,然后调用close(2)关闭文件,释放FILE结构体和I/O缓冲区。
注意:
open、 read、 write、 close等系统函数称为无缓冲I/O( Unbuffered I/O) 函数,因为它们位于C标准库的I/O缓冲区的底层。
C标准库函数是C标准的一部分,而Unbuffered I/O函数是UNIX标准的一部分。所以尽可能的使用C标准库,因为支持C的都支持这些标准,而不一定会支持UNIX标准,比如Windows系统就不支持。
2、open/close
open函数可以打开或