文件IO详解(二)---文件描述符(fd)和inode号的关系

1、文件描述符和inode号码是不同的两个东西。

2、对于每个进程,系统会建立一个进程控制块(PCB)来保存相关的信息,而这个PCB在内核中的表现其实就是一个称为task_struct的结构体,这个结构体的成员用来保存与此进程有关的相关信息,其中有个成员是struct file_struct  *files,它是用来找到此进程所有打开的文件列表的,files变量指向的是struct file_struct类型的结构体,这个结构体中有一个成员是一个指针数组struct file *fd_array[],这个数组中的每个元素会指向一个struct file的结构体,这个结构体是用来描述一个打开的文件的,有很多的成员,其中有个成员是指向struct file_operation的指针变量,而struct file_operation结构体中包括了很多的函数指针,也就是open,write,realease,read等等对文件进行操作的函数,具体这些函数的实现就是驱动开发需要做的事情。如下图所示。

3、在对文件操作前,必须要先打开文件,打开文件过程其实就是让程序能通过某个路径能够找到此文件,关闭文件就是将此路径断开,找不到文件。

时间: 2024-12-27 15:08:29

文件IO详解(二)---文件描述符(fd)和inode号的关系的相关文章

标准文件IO详解(二)---标准输入流、标准输出流和标准错误流

在文件 IO 中使用文件描述符fd来表示一个文件不同,而标准 IO 使用一个指向 FILE 对象的指针来代表一个文件.FILE 对象实际上是一个结构体,此结构体中封装了代表文件的文件描述符.当然不仅仅是含有文件描述符,其中还会记录属于该文件的用户缓冲区信息. 在文件 IO 详解笔记中提到过标准输入.标准输出和标准错误,分别对应文件描述符的0.1.2,也可以使用STDIN_FILENO.STDOUT_FILENO和STDERR_FILENO三个宏来代替.这三个文件描述符是创建进程时默认会打开的.

文件IO详解(五)---open函数详解

open函数用来在进程中打开文件,如果成功则返回一个文件描述符fd. ======================================================= 函数原型: 函数参数: pathname:打开文件的路径名 flags:用来控制打开文件的模式 mode:用来设置创建文件的权限(rwx).当flags中带有O_CREAT时才有效. 返回值: 调用成功时返回一个文件描述符fd 调用失败时返回-1,并修改errno ==========================

文件IO详解(十二)---原子操作之创建文件

使用open打开文件时,使用 O_CREAT 标志的话,就会在不存在文件的情况下去创建文件.所以说实际应该是有两个操作,一个是判断文件是否存在,另一个就是创建文件:而且这两个操作是作为一个原子操作执行的.如果不是作为一个原子操作执行的,那么就会分解成如下的程序段: 如果不作为一个原子操作执行那么在多进程中可能会出问题,假设两个操作不是作为原子操作执行的,当进程A在判断文件不存在后,便被挂起,进程B得以执行,然后创建了文件且向其中写入了数据,然后进程A被恢复,接着执行creat函数试图创建文件,而

文件IO详解(十)---文件共享(多进程之间、单进程之间)

在同一个进程中,实现文件共享的方法有两种: 多次使用open函数打开相同文件 使用dup/dup2函数或者fcntl函数 ======================================================== 对于第一种方法: 每次使用open函数打开文件时,操作系统内核中都会创建一个不同的文件表项(struct file结构体),但是这些不同的struct file结构体最终都会指向同一个struct inode结构体,因为一个文件只能对应唯一的一个struct in

文件IO详解(七)---lseek函数详解

lseek函数用来设置当前文件偏移量. ====================================================== 函数原型: 函数参数: fd:要操作的文件描述符 offset:基于whence参数的偏移量 whence:参考点位置 返回值: 调用成功时返回当前相对于文件开头的偏移量,以字节为单位 调用失败时返回 -1,并修改errno的值 ======================================================= when

文件IO详解(四)---标准输入、标准输出和标准错误

每个进程都会默认打开3个文件描述符,即0.1.2.其中0代表标准输入流.1代表标准输出流.2代表标准错误流.通常标准输入流对应着键盘的设备文件.标准输出流和错误流对应着显示器的设备文件.在编程中通常使用宏STDIN_FILENO.STDOUT_FILENO和STDERR_FILENO分别来代表0,1,2. 要注意一点: 0.1.2这三个文件描述符对应的是标准输入流.标准输出流和标准错误流而不是键盘设备文件和显示器设备文件.只是默认标准输入流对应着键盘设备文件,标准输出和错误对应着显示器设备文件.

(待续)文件IO详解(十六)---fcntl函数详解

fcntl函数是用来在进程中实现对文件的多种操作的函数,通过不同的命令可以实现不同的操作.常用的操作有复制文件描述符.为文件设置建议锁和获取设置文件控制标志等. ======================================================= 函数原型: ======================================================= 操作一:复制文件描述符实现文件共享 函数参数: fd:要操作的文件描述符 cmd:F_DUPFD ar

文件IO详解(八)---read函数详解

read函数用来在进程中读取某文件中的内容. 函数原型: 函数参数: fd:要读取的文件描述符 buf:保存从文件中读取到的内容的内存首地址 count:希望从文件读取到字节数 返回值: 读取文件发生错误时返回 -1 读取文件遇到文件结尾时返回 0 读取文件正常时返回实际读到的字节数 要注意希望读到的字节数和实际读到的字节数可能并不相等,实际读到的字节数总是小于等于希望读到的字节数.

文件IO详解(六)---close函数详解

close函数用来在进程中关闭文件.当使用close关闭文件时,加在该文件上的所有的建议锁都将会被释放.内核中的文件表项也将会被释放. 函数原型: 函数参数: fd:要关闭文件的文件描述符 返回值: 调用成功返回 0 调用失败返回 -1,并修改errno的值