1、open函数的返回值
在认识open函数的返回值之前,先来认识两个概念:系统调用和库函数。
(1)系统调用
open、close、read、write等都属于系统提供的接口,称之为系统调用接口。
(2)库函数
fopen、fclose、fread、fwrite都是C标准库当中的函数,称为库函数(libc)。
故,f#系列的函数,都是对系统调用的封装,方便二次开发。
下面来看一下open()函数:
int open(const char * pathname,int flags); int open(const char * pathname,int fiags,mode_t mode);
pathname:要打开或创建的目标文件;
flags:打开文件时,可以传入多个参数选项,用下面的一个或多个常量进行“或”运算,构成flags。
参数:
O_RDNOLY:只读打开;
O_WRONLY:只写打开;
O_RDWR:读,写打开;
(以上三个,必须且只能指定一个)
O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限;
O_APPEND:追加写;
返回值:
成功:新打开的文件描述符;
失败:-1;
open函数的返回值实际上就是文件描述符。
2、文件描述符 fd
文件描述符就相当于句柄,文件描述符就是一个小整数。
- Linux下默认有3个缺省打开的文件描述符,分别为:
0:标准输入(stdin)
1:标准输出(stdout)
2:标准错误(stderror)
- 0,1,2对应的物理设备是:键盘、显示器、显示器。
3、进程和file产生关联的过程
文件描述符就是从0开始的小整数。当打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,就是file结构体,来表示一个已经打开的文件对象。
进程执行open系统调用,必须让进程和文件关联起来。每个进程都有一个指针 *files ,指向一张表 files_struct ,该表最重要的部分就是包含一个指针数组(file * fd_array[ ]),每个元素都是一个指向打开文件的指针。
故,本质上文件描述符就是该数组的下标。
只要拿着文件描述符,就可以找到对应的文件。