在Unix系统中,操作系统通过系统接口(也叫系统调用)来提供服务,系统调用时内核中的代码,位于内核中。用户的应用处于用户空间中,因此用户进程调用系统调用的过程,就是进程由用户空间进入内核的过程。C语言的库函数就是通过系统调用来实现其功能的,可以说系统调用为库函数提供了底层的支持。这一章的内容主要就是介绍Unix系统中用于输入和输出的系统调用,并介绍如何通过它们实现标准库。
文件描述符
在Unix系统中所有的设备都被看成是文件系统中的文件,因此在Unix系统中的I/O操作都要通过读文件或者写文件来实现。这样做的好处就是,可以通过同一套的接口实现对所有外围设备的访问。书中详细介绍了打开一个文件的过程来介绍读写一个外围设备的过程。文件正常打开后,操作系统将向程序返回一个小的非负整数,这个整数就是文件描述符。在这里注意区别和库函数中的文件指针的概念,文件指针是在库函数中描述文件的,它是对文件描述符的包装,包含有比文件描述符更丰富的内容。
低级I/O——read和write
外部设备的输入与输出是通过read和write来实现的。这两个系统调用的一般格式如下:
int n_read = read(int fd, char *buf, int n);
int n_written = write(int fd, char *buf, int n);
读文件时返回值可能会小于请求的字节数,如果返回为0,则表示已经读到文件结尾(EOF);如果返回值为-1,则说明发生了错误。
写文件时返回值是实际写入的字节数,如果返回值与请求的字节数不相等,则说明发生了错误。
open、create、close、unlink
open和create是用来打开和创建文件的。close则用来显示的关闭已经打开的文件,如果没有显示的关闭文件,那么在程序结束运行是,操作系统会将文件关闭。
lseek
随机访问