首先理解I/O
输入/输出(I/O)是主存和外部设备(如磁盘、终端和网络)之间拷贝数据的方式。输入是从设备拷贝数据到主存,输出反之。
Unix I/O
所有的I/O设备,如网络、磁盘和终端,都是被模型化为了文件,所有的输入和输出都被当作相对应的文件来读和写操作。
正是因为这种将设备映射为文件的方式,在我们要对一个设备进行操作时只要对向对应的文件进行操作即可,而Unix内核也引出了一个简单、低级的应用接口,UnixI/O,这使得所有的输入和输出都能以一种统一的方式来执行。
打开文件open
- 一个应用程序通过要求内核打开相应的文件,来宣告它要访问一个I/O设备。
- 内核返回一个小的非负整数,叫做描述符,它在后续对此文件的操作中标识这个文件。
- 内核记录有关这个文件文件的所有信息;应用程序只需记住这个描述符。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h
int open(char *filename,int flags);
int open(char *filename,int flags,mode_t);
//返回:若成功则返回新文件的描述符,出错为-1
filename:要打开或创建的文件
flags:指明了进程打算如何访问这个文件
//具体使用哪个open函数,根据场景,如果目标文件存在,则使用第一个,需要open创建,则需要第三个参数来表示创建文件的的默认权限
flags参数:
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写O_CREAT:如果文件不存在,就创建它的一个空文件,需要使用mode选项来指明它的访问权限
O_APPEND:在每次写操作前,设置文件位置到文件的结尾处
例如:fd=Open(”foo.text”,0_RDONLY)
以读的方式打开一个已存在的文件
mode参数
文件描述符
数组里的下标0,1,2分别指向标准输入、标准输出、标准错误
这三个也是缺省默认的
后面从3开始分别对应相应的文件,所以文件描述符其实就是这个数组的对应下标
关闭文件
#include<unistd.h>
int close(int fd);
//fd:文件描述符
返回:若成功为0,出错-1
注意:文件描述符的分配规则
在files_struct数组中,当前没有被使用的最小下标,作为新的文件描述符