linux---文件描述符和重定向

文件描述符
进程就是通过struct file结构体来描述打开的文件,使用struct file* fd_array[]来存储我们的文件。那什么是文件描述符呢?

  1. 什么是文件描述符:
    文件描述符就是struct file* array[]数组的下标,用户打开文件,操作系统通过file结构体描述文件,并且将指针添加到array中去管理,,想用户返回这个文件描述信息,在数组位置(下标),用户操作文件的时候,将这个下标传递给操作系统,操作系统通过下标找到文件描述信息,进而操作文件

在这里插入图片描述

  • 进程中的文件描述符
    当我们打开一个进程的时候,我们就会默认打开三个文件描述符,

  • 0:标准输入:STDIN_FILENO

  • 1:标准输出:STDOUT_FILENO

  • 2:标准错误:STDERR_FILENO

在这里插入图片描述
当我们打开文件的时候就会使用一个新的文件描述符,但是文件描述符有自己的分配规则:最小未使用原则。当我们在前面有未使用的最小的文件描述符的时候,我们在打开新的文件描述符时我们就使用这个最小的文件描述符。

  1. 库函数和系统调用接口中的操作句柄

    在库函数中我们的操作句柄是文件流指针

    • stdin
    • stdout
    • stderr
      在系统调用接口中我们的操作句柄就是文件描述符

系统调用接口和库函数本来就是上下级的关系,所有操作句柄同样是有包含关系的,文件流指针就包含了我们的文件描述符就是说,在文件流指针的结构体中就有一个成员变量是文件描述符

重定向
改变数据流向,将写入制定文件数据改变之后写到另一个文件

       #include <unistd.h>
       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

参数:

  • oldfd:原指向的文件描述符。
  • newfd:改变的文件描述符。
    让newfd也指向oldfd指向的文件,如果newfd已经打开了一个文件的话,就关闭以前的文件
  1 #include <stdio.h>
  2 #include <fcntl.h>
  3 #include <unistd.h>
  4 #include <sys/stat.h>
  5 #include <string.h>
  6 #include <sys/types.h>
  7 int main(){
  8     int fd = open("te.txt",O_RDWR|O_APPEND);
  9     char buf[1024] = "你好啊!!";
 10     dup2(1,fd);                                                             
 11     write(fd,buf,strlen(buf));
 12     return 0;
 13 }
~      

实现向文件中写入内容进行数据重定向,将数据输出到显示器中,并不写到文件中去。这就是我们的重定向

猜你喜欢

转载自blog.csdn.net/boke_fengwei/article/details/89279191