文件描述符&&文件流指针

文件描述符和文件流指针的关系

文件流指针是标准库操作句柄:FILE*
文件描述符是系统调用接口句柄:int fd
文件流指针中包含了一个成员变量是—文件描述符
库函数内部封装的就是系统调用接口
缓冲区是用户态的缓冲区,存在于文件流指针结构体中

一个进程被创建–>默认打开三个文件
文件描述符&&文件流指针_第1张图片

文件描述符:
每个运行起来的进程 Linux 操作系统都会为其创建一个 task_struct 结构体,称为进程描述符或进程控制块(PCB),通过 PCB 管理进程

而在 task_strut 结构体中有一个指针指向了 files_struct 结构体,files_struct 结构体存储了该进程的各种关于文件的信息,其中包括 struct file * fd_array[] 这个数组(称为文件描述符表),每打开一个文件都会创建一个 file 结构体来存放文件的描述信息,这个结构体会被放在文件描述符表中,而文件描述符就是一个数组下标

通过这个数组下标和这个数组就能找到文件的描述信息(struct file 结构体)

文件描述符&&文件流指针_第2张图片

文件描述符分配规则:
最小未使用
最小的未使用的下标(从数组开头寻找未使用的下标,找到就将这个下标作为当前的文件描述符,因此是最小未使用)

重定向:
> 清空重定向
>> 追加重定向
dup2(fd, 1);

fd 是文件描述符
将 1 也就是标准输出文件重定向到 fd 对应的文件
该显示到显示器上的数据,都会被输出到 fd 所描述的文件中
文件描述符的重定向 – 改变一个描述符对应的文件描述信息
改变了文件描述符对应的文件描述信息,这时候对描述符写入数据,数据就从原本要写入的文件,流向了新的文件

\n
刷新缓冲区仅仅针对的是标准输出文件,对于其他的磁盘文件并不具备刷新缓冲区的作用
系统调用因为没有缓冲区,因此不会执行刷新缓冲区的动作

minishell的重定向实现:

  1. 先对命令行的输入进行字符串解析,获取到索要执行的程序和参数
  2. 判断参数中有重定向符号(> 清空, >> 追加)
  3. 打开文件,打开方式不同,清空重定向 --> O_CREATE|O_TRUNC|O_WRONLY,追加重定向 --> O_CREATE|O_APPEND|O_WRONLY
  4. 文件描述符重定向:dup2(int oldfd, int newfd) 将 newfd 指向 oldfd 所指向的文件,将 newfd 下标对应的描述信息修改为 oldfd 对应的描述信息,相当于操作的都是 oldfd 所指向的文件

自主实现 minishell

你可能感兴趣的:(操作系统,Linux,文件描述符,文件流指针)