Head First C学习之文件描述符、fileno()、dup()

进程用文件描述符表示数据流

  • 文件描述符是一个数字,它代表一条数据流。
  • 进程会把文件描述符和对应的数据流保存在描述符表中。

描述符表:

名称 描述符号 数据流
标准输入 0 键盘
标准输出 1 屏幕
标准错误 2 屏幕
其他形式的数据流 3 数据库连接
  • 虽然叫文件描述符,但它不一定是连接硬盘上的某个文件,有可能是连接键盘屏幕文件指针网络
  • 描述符表的前三项万年不变
  • 其他项要么为空,要么连接进程打开的数据流。
    创建进程以后,标准输入连接到到键盘,标准输出标准错误连接到屏幕。它们保持这样的连接,知道有人把他们重定向到其他地方。

fileno()返回描述符号

每打开一个文件,操作系统都会在描述符表中新注册一项。

#include 
int fileno(FILE *stream);
FLIE * my_file = fopen("guitar.mp3","r");

操作系统会遍历描述符表寻找空项,把新文件注册在其中。

描述符号 数据流
3 数据库连接
4 guitar.mp3文件

利用fileno()函数获取它的描述符

int descriptor = fileno(my_file)

dup2()复制数据流

#include   
int dup( int oldfd );
int dup2( int oldfd, int targetfd );  
dup(4,3);

3号描述符重新指向4,假设4号描述符中注册了guitar.mp3文件指针。虽然guitar.mp3只有一个,与它相连的数据流野只有一条,但数据流(FILE*)同时注册在文件描述符3和4中

描述符号 数据流
3 数据库连接 (guitar.mp3文件)
4 guitar.mp3文件

你可能感兴趣的:(Head First C学习之文件描述符、fileno()、dup())