文件描述符

文件描述符是什么?

1.文件描述符是一个整数
Linux进程默认情况下会有3个缺省打开的文件描述符分别是:
标准输入stdin(0)
标准输出stdout(1)
标准错误(2)
2.文件描述符是从0开始的整数

怎样得到文件描述符?

当open打开某文件时,如果打开成功,此时的返回值就是此文件的描述符

文件描述符的详解
这里写图片描述

每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分是包含了一个指针数组,每个元素都是一个指向打开文件的指针
本质上,文件描述符是files_struct表中数组的下标,故拿着文件描述符可以找到对应的文件

当我们打开文件时,操作系统内存中会新创建相应的数据结构来描述目标文件,于是就有了file结构体,表示一个已经打开的文件对象,而进程执行open系统调用,所以必须让进程和文件相关联起来,

文件描述符的分配规则

在files_struct数组当中,找到当前没有被使用的而且是最小的一个下标,作为新的文件描述符

示例
1.
代码:

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
 int fd1=open("myfile",O_RDONLY);
 int fd2=open("file",O_WRONLY|O_CREAT,0644);
 if(fd1<0||fd2<0)
 {
  perror("open");
  exit(1);
 }
 printf("fd1=%d,fd2=%d\n",fd1,fd2);
 close(fd1);
 close(fd2);
 return 0;
}

运行结果:
这里写图片描述
linux进程默认情况下会打开三个文件:标准输出、标准输入、标准错误,这三个文件的描述符分别是0、1、2,如果再打开文件的话,文件的描述符就会依次递增

2.
代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
 close(0);
 int fd1=open("myfile",O_RDONLY);
 int fd2=open("file",O_RDONLY|O_CREAT,0644);    
 if(fd1<0||fd2<0)
 {
  perror("open");
  exit(1);
 }
 printf("fd1=%d,fd2=%d\n",fd1,fd2);
 close(fd1);
 close(fd2);
 return  0;
}

运行结果:
这里写图片描述
如果某个文件被关闭,本来标记它的描述符就会被系统回收,打开新文件的话,系统会给新文件一个描述符,此描述符就是没有被使用的而且是最小的,后面再打开文件的话,文件描述符的分配规则同理

3.
代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
 close(2);
 int fd1=open("myfile",O_RDONLY);
 int fd2=open("file",O_RDONLY);
 if(fd1<0||fd2<0)
 {
  perror("open");
  exit(1);
 }
 printf("fd1=%d,fd2=%d\n",fd1,fd2);
 close(fd1);
 close(fd2);
 return 0;
}

运行结果:
这里写图片描述
4.
代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
 close(0);
 close(2);
 int fd1=open("myfile",O_RDONLY);
 int fd2=open("file",O_RDONLY);
 if(fd1<0||fd2<0)
 {
  perror("open");
  exit(1);
 }
 printf("fd1=%d,fd2=%d\n",fd1,fd2);
 close(fd1);
 close(fd2);
 return 0;
}

运行结果:
这里写图片描述

故文件描述符的分配规则是
在files_struct中找到当前最小的没有被使用的作为文件的描述符

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值