【Linux】文件描述符

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[ ]),每个元素都是一个指向打开文件的指针。

故,本质上文件描述符就是该数组的下标。

只要拿着文件描述符,就可以找到对应的文件。

猜你喜欢

转载自blog.csdn.net/weixin_38682277/article/details/79646977