进程用文件描述符表示数据流
- 文件描述符是一个数字,它代表一条数据流。
- 进程会把
文件描述符
和对应的数据流保存在描述符表
中。
描述符表:
名称 | 描述符号 | 数据流 |
---|---|---|
标准输入 | 0 | 键盘 |
标准输出 | 1 | 屏幕 |
标准错误 | 2 | 屏幕 |
其他形式的数据流 | 3 | 数据库连接 |
- 虽然叫文件描述符,但它不一定是连接硬盘上的某个文件,有可能是连接
键盘
、屏幕
、文件指针
或网络
。 - 描述符表的前三项万年不变
- 其他项要么为空,要么连接进程打开的数据流。
创建进程
以后,标准输入
连接到到键盘,标准输出
和标准错误
连接到屏幕。它们保持这样的连接,知道有人把他们重定向
到其他地方。
fileno()返回描述符号
每打开一个文件,操作系统都会在描述符表
中新注册一项。
#include <stdio.h>
int fileno(FILE *stream);
FLIE * my_file = fopen("guitar.mp3","r");
操作系统会遍历描述符表
寻找空项,把新文件注册在其中。
描述符号 | 数据流 |
---|---|
3 | 数据库连接 |
4 | guitar.mp3文件 |
利用fileno()函数获取它的描述符
int descriptor = fileno(my_file)
dup2()复制数据流
#include <unistd.h>
int dup( int oldfd );
int dup2( int oldfd, int targetfd );
dup(4,3);
将3
号描述符重新指向4
,假设4
号描述符中注册了guitar.mp3
文件指针。虽然guitar.mp3
只有一个,与它相连的数据流野只有一条,但数据流(FILE*)
同时注册在文件描述符3和4中
描述符号 | 数据流 |
---|---|
3 |
|
4 | guitar.mp3文件 |
网友评论