linux 文件描述符,文件描述符表

大家好,今天来为大家分享linux 文件描述符的一些知识点,和文件描述符表的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

Linux--文件描述符和stdin,stdout,stderr

深入解析Linux中的文件描述符与stdin, stdout, stderr

在Linux的世界里,文件描述符如同数据的桥梁,连接着程序与操作系统,为每个打开的文件提供独一无二的访问标识。当你请求访问一个文件,内核会返回一个指向全局文件表的入口,包含文件位置、偏移量和访问权限等信息。这个标识通常用非负整数表示,如0、1、567,每个打开的文件至少对应一个文件描述符。

stdin, stdout, stderr的亲密伙伴

在Unix系统中,0、1、2这三个特殊文件描述符分别对应着stdin(标准输入)、stdout(标准输出)和stderr(标准错误输出)。在终端交互中,比如输入命令和查看结果,stdin接收用户的键盘输入,stdout则显示处理后的结果,而stderr用于输出错误信息。当执行ls命令时,如果文件不存在,错误信息会通过stderr呈现,而正常输出则通过stdout呈现。

数据流的秘密通道

理解stdout和stderr的关键在于它们的数据流差异。在命令执行过程中,屏幕上的输出并非直接来自文件描述符,而是通过控制流决定。例如,通过重定向符号(>、>>、<、<<)可以改变数据流向。将stderr重定向到/dev/null,错误信息会被“吞噬”;而将stdout重定向到文件,如capture.txt,可以捕获命令的输出。而尝试重定向stdout到stdout.txt时,错误信息依然通过stderr输出,这再次强调了两个数据流的独立性。

重定向的艺术

Linux中的重定向操作是数据流控制的巧妙工具。如将ls命令的输出重定向到capture.txt,会发现text.txt被成功保存。然而,尝试将ls dne.file的错误信息重定向到stdout.txt时,虽然命令行显示了错误,但stdout.txt中却空无一物,这进一步突出了stdout和stderr的不同作用。

总结:洞悉文件描述符的奥秘

掌握文件描述符的机制,弄清楚stdin、stdout和stderr各自的角色,是理解Linux编程和命令行操作的基础。理解它们如何在程序与系统间传递数据,以及如何通过重定向控制数据流向,将使你成为Linux世界中的熟练操作者。

Linux文件描述符表和文件的关系

Linux中的文件类型

Linux系统中把一切都看做文件,包括普通文件-、目录文件d、字符设备文件c、块设备文件b、符号链接文件l。文件描述符是内核为了高效管理已被打开的文件所创建的索引(一个非负整数),用于指代已被打开的文件,Linux下所有的的I/O操作的系统调用都是通过文件描述符执行。例如0表示标准输入、1表示标准输出、3表示标准错误

,文件描述符会在这个基础上递增。

文件描述符、文件、进程之间的关系

每个文件描述符都指向一个打开的文件相对应

不同的文件描述符可能指向同一个打开的文件

相同的文件可能被不同的进程打开,也可以在被同一个进程打开多次

文件描述符表:

进程级的列表,也就是用户区的一部分,进程每打开一个文件就会新建一个文件描述符,同时只能通过文件描述符的函数访问,否则进程无法直接对其进行访问。

系统文件表:

系统级的列表,对当前系统的所有进程都共享,每条条目包含文件偏移量、访问模式以及指向它的文件描述符的条目计数

文件系统索引节点表:

inode索引节点表(UID、GID、ctime、mtime、atime、读写执行权限、链接数、block位置)

Linux操作系统 文件描述符

Inode存储文件元数据,包括文件编号、权限、拥有者UID、所属组GID、硬链接数、大小、时间戳和数据块指针。

通过Linux的stat命令查看文件Inode信息。参数解释为:

目录与文件名保存在父目录block中,通过block可定位到文件名与Inode关系。

Linux中,内核使用inode定位文件,但一个文件可被多个用户同时打开或多次打开。为管理位移量,避免不同操作导致的差异,引入文件描述符(file descriptor)。

每次打开文件产生一个文件描述符,对应当前文件偏移量等数据。一个inode可以关联多个文件描述符,多个描述符指向同一inode。

打开文件时,内核生成文件描述符。三个表:文件描述符表、打开文件表和inode表,描述通过描述符找到物理位置。

重定向符号<、>、<>用于重定向输入输出。例如,<>以读写模式打开socket文件。

建立链接时,创建socket文件描述符,使用exec命令与目标端口建立连接。

使用exec命令替换当前shell,执行指定命令。避免影响主shell,通常将exec放在shell脚本中。

exec命令后,当前shell进程被替换,仅执行指定命令。避免直接使用exec命令影响shell操作。

文件操作底层流程包括打开、关闭文件。实践示例:读写socket、向百度发送HTTP请求。

建立链接时,创建socket文件描述符,使用<>符号以读写模式打开。

查看进程文件描述符,确认创建的描述符。

exec命令替换shell,执行命令。注意区别source命令与exec命令在文件描述符操作上的行为。

发送请求,获取响应。使用cat命令与文件描述符关联,将socket文件内容输出。

获取百度返回信息,完成请求响应流程。

关注学习资料、教学视频和学习路线图,可加入交流群获取更多Linux后台服务器架构开发和内核学习资源。

阅读剩余
THE END