文件描述符与重定向

Posted 李憨憨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件描述符与重定向相关的知识,希望对你有一定的参考价值。

文件描述符与重定向



一、文件描述符

1.文件描述符

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

在这里插入图片描述

2.重定向原理

代码如下(示例):

   #include<stdio.h>
   #include<unistd.h>
   #include<stdlib.h>
   #include<fcntl.h>
   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
在这里插入图片描述


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

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

3.分配规则

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

在这里插入图片描述


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

4.系统调用接口

在这里插入图片描述


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

基本使用:

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

在这里插入图片描述

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

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

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

以上是关于文件描述符与重定向的主要内容,如果未能解决你的问题,请参考以下文章

文件描述符与重定向

jsp初识servlet转发转发与重定向的比较

管道与重定向(有重定向习题未做)

htaccess 301 与重定向 404

文件管理与重定向

转发与重定向学习代码