Linux 文件描述符

//////////////////////////////////////////////////////////////////////////////////////////////////////

1、UNIX文件描述符

Unix操作系统或者Linux操作系统的文件描述符使用一个非负整数来表示,但是文件描述符不仅仅是一个非负数,Unix对于文件IO有以下几个数据结构:

A.       每个进程都有一个进程表,其中有个记录表项,这个记录表项指向的是一个打开文件描述符表,这个文件描述符表是一个矢量表,每个文件描述符占用的是一个表项,但是这个表项里面包含两部分内容第一个是文件描述符标志,也就是通常所属的fd,另一个内容是一个指向文件表项的指针;这里指向的是一个文件表项,不是一个文件表。

B.       Unix/Linux内核为所有打开的文件建立了一个文件表由文件表项来构成。其中每个文件表项包含一下几个方面的内容:第一个是文件状态标志,这个标志指明了文件的当前状态,比如说,可读,可写,阻塞等;第二个是当前文件偏移量;第三个是指向文件v节点的指针;从这里也可以看出来为什么在另外的一个终端中打开已经打开的一个文件的时候,显示的并不是文件的开头部分,而是文件的当前偏移位置,但是当另外一个用户登录的时候,显示的是文件的开头部分。

C.       每个打开的文件都有一个V节点结构,Linux没有这个结构。这个v节点包含两个部分:第一个部分是文件操作的函数,第二个部分是文件的i节点;其中i节点包含的是文件的所有者,文件长度,指向文件实际数据块在磁盘上的位置的指针等信息。I节点的这些信息是在从磁盘读入内存的时候从磁盘获取的。

使用v节点的目的是为了能够支持多文件系统类型。

//////////////////////////////////////////////////////////////////////////////////////////////////////

参考:《Unix 环境高级编程》

时间: 2024-08-27 14:10:06

Linux 文件描述符的相关文章

[性能分析]linux文件描述符(转)

1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件.这些文件一般是用一些相关的应用程序创建,比如图像工具.文档工具.归档工具... .... 或 cp工具等.这类文件的删除方式是用rm 命令:2.目录文件在l

Linux 文件描述符问题

昨天解了个bug,关于文件描述符的,这种问题很久之前也遇到过,这次再犯真的不该. 问题是这样的. fopen()打开一个文件,然后做了一些操作,然后函数执行结束...没有调用fclose()导致了,再执行此函数时,系统提示,文件描述符分配完毕. 分析了下: 根据以前的知识储备, 1.linux打开文件描述符的最大个数为1024,根据这次发现, 2.这是针对于单独进程的, 3.是从/proc/{pid}/fd/这个文件夹下可以看到. 4.分配文件描述符是递增的顺序.(看我之前的博客会发现这是那个b

[性能分析]linux文件描述符

1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件.这些文件一般是用一些相关的应用程序创建,比如图像工具.文档工具.归档工具... .... 或 cp工具等.这类文件的删除方式是用rm 命令:2.目录文件在l

[转帖]linux文件描述符文件/etc/security/limits.conf

linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习了解一下. 文件描述符是什么?和文件句柄有啥区别? 文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法. Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件.标准C中每个进程默认打开的有三个文

关于Linux文件描述符的笔记

当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符.所谓的文件描述符是一个低级的正整数.最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应.因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout.你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件. 首先说什么是文件描述符,它有什么作用? 文件描述符是一个简单的整数,用以标明每一个被

Linux 文件描述符设置为非阻塞的方法

通过fcntl设置文件描述符属性 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在server开发中可以封装为基本函数) 1.获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0); 2.设置文件的flags: fcntl(fd,F_SETFL,flags); 3.增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd,F_GETFL,0

调整进程的最大linux文件描述符

1.介绍 ulimit 命令提供了针对 shell和或由该 shell 启动的进程占用资源的控制. 持久化修改生效是在/etc/security/limits.conf中进行数据写入. 写入的格式为:<domain><type><item><value> domain:用户名/用户组名/其他(查看man limits.conf) type: hard / soft ,分别指实际最大值类型和预警值类型,一个是max,一个是threshold,在threshol

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

1.预备知识 标准输入(stdin).标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种. 文件描述符 是与打开的某个文件或者数据流相关联的整数.文件描述符0,1,2是系统预留的. 0 - stdin(标准输入) 1 - stdout(标准输出) 2 - stderr(标准错误) 2.实例 echo This is a sample. > temp.txt 可将文本输出到 temp.txt 中,是通过截断文件的方式,也就是说在echo命令

linux文件描述符open file descriptors与open files的区别

一个文件被打开,也可能没有文件描述符,比如current working diretories,memory mapped files and executable text files ;losf可以查岀某个进程打开的文件数目: [email protected] ~]# sh sh-4.1# lsof |grep 1407 rpcbind 1407 rpc cwd DIR 253,0 4096 2 / rpcbind 1407 rpc rtd DIR 253,0 4096 2 / rpcbi