文件描述符与重定向

文件描述符与重定向


文章目录

  • 文件描述符与重定向
  • 一、文件描述符
    • 1.文件描述符
    • 2.重定向原理
    • 3.分配规则
    • 4.系统调用接口
    • 5.文件描述符与文件流指针


一、文件描述符

1.文件描述符

  文件描述符:系统调用IO接口的操作句柄--非负整数 文件描述符的本质:内核中进程打开的文件描述信息表中的下标;

文件描述符与重定向_第1张图片

2.重定向原理

代码如下(示例):

   #include
   #include
   #include
   #include
   int main()
   {
     
       int fd = open("test.txt", O_RDWR|O_CREAT, 0777);
       if(fd < 0){
     
           perror("open error");
          return -1;
      }
      printf("fd=%d\n", fd);
      return 0;
  }

此时的fd为3
在这里插入图片描述
在这里插入图片描述
如果我此时把1关掉
在这里插入图片描述
此时什么都没有打印,但当我们打开test.txt时,里面多了一行fd=1
文件描述符与重定向_第2张图片


一个进程中默认会打开三个文件:标准输入,标准输出,标准错误

标准输入文件 0 stdin
标准输出文件 1 stdout
标准错误文件 2 stderr
重定向:通过改变文件描述符这个下标位置所保存的文件描述信息,进而改变这个描述符所操作的文件,实现改变数据的流向

3.分配规则

文件描述符分配规则:最小未使用

文件描述符与重定向_第3张图片


printf也属于标准输出,所以此时将数据写入了test.txt中

4.系统调用接口

文件描述符与重定向_第4张图片


让newfd从oldfd中拷贝文件描述信息地址,把newfd重定向到oldfd对应的文件上

基本使用:

dup2(fd, 1);//将标准输出重定向到test.txt

文件描述符与重定向_第5张图片

5.文件描述符与文件流指针

文件描述符:int,系统调用IO接口的操作句柄 文件流指针:FILE*,库函数调用IO接口的操作句柄 库函数与系统调用接口的关系:库函数封装了系统调用接口 通过库函数进行IO操作,最终是会归纳到使用系统调用接口完成IO操作

通过库函数fopen打开一个文件所经历的事情:
文件描述符与重定向_第6张图片
库函数IO与系统调用IO的区别:
缓冲区:通常所说的那个换行刷新缓冲区的这个缓冲区,是文件流指针所有的,对于文件描述符或者系统调用来说,是没有的
文件流指针中的这个缓冲区被称之为用户态缓冲区

你可能感兴趣的:(Linux)