文件描述符
每个进程都有一个指针*file,指向表file_struct,该表中最重要的部分是fd_array[]的一个指针数组,每个元素都是一个指向打开文件的指针。文件描述符就是该数组的下标。系统对每一个进程都默认打开三个文件:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)。对应的文件描述符分别是0、1、2。在Linux下,对设备和文件的操作都使用文件描述符来进行的。
文件描述符的分配规则:
文件描述符分配按最小原则,即在file_struct数组中找到没被使用的最小的一个下标,作文新的文件描述符。
既然文件描述符按最小原则分配,那如果关闭标准输入,打开新文件file,file就会分配到0文件描述符。可以实现把文件中的数据输出到显示器上。代码如下:
1 #include<stdio.h>
2 #include<sys/stat.h>
3 #include<sys/types.h>
4 #include<fcntl.h>
5 #include<stdlib.h>
6 #include<string.h>
7
8 int main()
9 {
10 close(0);
11 int fd = open("./test.c",O_RDONLY);
12 if(fd<0){perror("open");exit(1);}
13 while(1){
14 char buf[1024]={0};
15 scanf("%s",buf);
16 if(strlen(buf)==0)
17 break;
18 printf("%s\n",buf);
19 fflush(stdout);
20 }
21 return 0;
22 }
FILE结构体:FILE结构体中包含fd
file_struct结构体
struct files_struct
{
struct file ** fd; /* 指向文件描述符数组的指针 */
};
file结构体中重要的几个参数:
struct file
{
mode_t f_mode; /*文件的打开模式(读、写等)*/
loff_t f_pos; /*文件的当前位置*/
unsigned short f_flags; /*打开文件时所指定的标志(读写权限)*/
unsigned short f_count; /*使用该结构的进程数(引用计数)*/
};