Linux--文件描述符,文件重定向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ferlan/article/details/83314921

文件描述符

什么是文件描述符?

先来说说文件:
当我们打开一个文件时,操作系统为了管理该文件,会创建一个数据结构来描述它,记录他的各种信息,这个数据结构就是FILE结构体,一个FILE结构体就表示了一个已经打开的文件。
进程中使用open函数打开某个文件,前提是需要我们将进程与文件联系起来。所以进程PCB中就有一个* files指针,这个*files指针指向一个数组files_struct,数组内每个元素都对应了一个文件指针,文件指针指向各个FILE结构体。
而文件描述符就是这个数组的下标,根据数组的下标可以找到对应的文件指针,也就能操作文件了。

说的话可能可能还不够清楚,我们直接上图:
在这里插入图片描述

系统怎么样通过文件描述符找到对应的文件?

当进程中要对文件进行操作时,就会从进程PCB中读取*files指针,找到对应的文件表files_struct,再通过文件描述符找到数组对应的文件指针,对文件进行操作。

文件描述符的一些规则

  1. 根据上图,我们发现,数组下标0,1,2对应了标准输入,标准输出,标准错误输出,这并不是偶然,每一个文件打开时都会自动产生3个默认的文件描述符“标准输入,标准输出,标准错误输出”,且顺序为0,1,2.
  2. 在新打开文件时,文件描述符的分配原则是:优先用未被使用的最小描述符.

文件重定向

什么是文件重定向

先来看一段代码:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>

int main()
{
	close(1);
	int fd=open("test.txt",O_WRONLY|O_CREAT ,0664);
	if (fd < 0)
	{
		perror("open error");
		return -1;
	}
	printf("fd: %d\n",fd);
	fflush(stdout);
}
close(fd);
exit(0);
}

我们发现,本应该写到屏幕上的fd,却写入到了test.txt文件中,这就是文件重定向.
先上图:
在这里插入图片描述

代码中先是关闭了1号描述符,也就是标准输出,而后打开test.txt文件,根据分配规则,test.txt的文件描述符为1,当再次使用文件描述符输出时,本应该输出到屏幕的文本就写入到test.txt中了.

文件重定向的用法

与命令行搭配使用:

标准输入重定向定义: 原本从标准输入读取数据重新定向为从其他文件读取数据
标准输出重定向定义: 将原来要输出到标准输出的内容,重定向后输出到指定的其他文件

<       标准输入重定向
>       标准输出重定向    清空原有内容后添加新内容
>>     标准输出重定向     向原有内容下方添加新内容

ls >/dev/null 2>&1 标准输出(1)重定向为/dev/null 标准错误输出(2)指向(1)(也指向/dev/null)

ls 2>&1 /dev/null 标准错误输出(2)重定向为标准输出(1),标准输出(1)重定向为/dev/null

在代码中使用

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ferlan/article/details/83314921