深入理解计算机操作系统——第10章:UNIX IO,打开,关闭,读写文件
系统级IO:输入输出是主存与外部设备(磁盘,终端,网络)之间拷贝数据的过程
输入:从IO设备拷贝数据到主存中
输出:从主存中拷贝数据到IO设备中
10.1 unix IO
所有的IO设备都被模型化为文件,而所有的输入输出都被当做对相应的文件的读和写来执行。
打开文件:
(1)应用程序通过要求内核来打开相应的文件,内核返回一个非负整数(描述符),应用程序只需记住这个描述符,而相应信息
由内核来管理。
(2)unix外壳在打开一个进程时,都打开了三个文件:标准输入(描述符0),标准输出(描述符1),标准错误(描述符2)。
改变当前文件位置:
(1)对于每个打开的文件,内核保持着一个文件位置k,初始为0,这个位置是文件开头的起始字节偏移
(2)通过seek来设置k。
读文件操作:
(1)拷贝n个字节文件到存储器,从k开始,然后k增加到k+n。
(2)当文件大小为m时,而m<k,那么会触发一个EOF条件(即文件太少了,不够你读的字节数)。
写文件操作:
(1)从存储器拷贝n>0个字节到文件。从当前文件的k开始,然后更新k。
关闭文件:
(1)当应用完成对文件访问后,会通知内核关闭文件,而作为响应,内核会打开文件时创建的数据结构,并将这个
描述符恢复到可用的描述符池中。
(2)无论一个进程因何种原因终止时,内核都会关闭所有打开的文件,并释放它们在存储器中的资源。
10.2 打开和关闭文件
通过open打开一个已创建的文件或创建一个新文件。
open函数:
int open(char *filename,int flag,mode_t mode);
(1)filename:文件名。
(2)flags:如何访问这个文件。
(3)mode:新文件的访问权限。
若成功返回描述符。
close函数:
int close(int fd);
(1)fd为描述符
若成功则返回0,否则返回-1.
10.3 读和写文件
read和write函数来执行输入输出。
read函数:
ssize_t read(int fd,void *buf,size_t n);
(1)从描述符为fd的文件,拷贝最多n个字节的数据到存储器的buf
(2)若成功返回实际的字节数
(3)返回0表示遇到EOF
(4)返回-1表示遇到错误
ssize_t write(int fd,const void *buf,size_t n)
(1)从存储器的buf拷贝最多n个字节的数据到fd文件的当前位置