文件描述符与inode的关系

文件描述符

Linux中,文件描述符(File descriptor,fd),是表示指向文件的引用的抽象化概念,在形式上是一个非负整数,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符

下面open系统调用返回一个文件描述符给fd

fd = open(pathname, flags, mode)

常见的几个文件描述符:

  • STDIN,文件描述符:0;标准输入,默认从键盘读取信息;

  • STDOUT,文件描述符:1;标准输出,默认将输出结果输出至终端;

  • STDERR,文件描述符:2;标准错误,默认将输出结果输出至终端

向标准输出中写入字符串

标准输出的文件描述符为1

#include <string.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char *msg = "Hello, world!\n";
    syscall(SYS_write, 1, msg, strlen(msg));

    return 0;
}

编译运行:

$  ./a.out
Hello, world!

inode

inode是用来存储文件元数据的,stat命令可以输出一个文件的元信息

stat C
  File: C
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d      Inode: 786444      Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ zaralts)   Gid: ( 1000/ zaralts)
Access: 2022-04-09 16:44:06.279746438 +0800
Modify: 2022-04-07 22:51:11.594725534 +0800
Change: 2022-04-07 22:51:11.594725534 +0800
 Birth: -

df -i 命令查看每个硬盘分区的inode总数和已经使用的数量

 df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
udev            493942    484  493458    1% /dev
tmpfs           500214   1088  499126    1% /run
/dev/sda1      2621440 227759 2393681    9% /
tmpfs           500214      1  500213    1% /dev/shm
tmpfs           500214      5  500209    1% /run/lock
tmpfs           500214     18  500196    1% /sys/fs/cgroup
tmpfs           500214     25  500189    1% /run/user/121
tmpfs           500214     49  500165    1% /run/user/1000

ll -i可以列出当前目录所有的包括inode号的文件信息

inode号是在第一列

ll -i
528761 drwxr-xr-x 22 zaralts zaralts  4096 48 21:17 ./
524289 drwxr-xr-x  3 root    root     4096 42 16:31 ../
524792 -rw-------  1 zaralts zaralts  5848 48 15:36 .bash_history
528764 -rw-r--r--  1 zaralts zaralts   220 42 16:31 .bash_logout
528762 -rw-r--r--  1 zaralts zaralts  3771 42 16:31 .bashrc

在这里插入图片描述

  • 每个进程都会有文件描述符表,该表的每一条都记录了单个文件描述符的相关信息
  • 内核对所有打开的文件维护有一个系统级的描述表格(open file description table),表中各条目称为打开文件句柄(open file handle),一个打开文件句柄存储了与一个打开文件相关的全部信息,比如当前文件偏移量、对该文件 i-node 对象的引用等

/proc/pid/fd

该文件夹包含了某一进程所占用的文件描述符
下图中socket:后面显示的是对应的inode号

/proc/92044/fd$ ll
total 0
dr-x------ 2 zaralts zaralts  0 49 21:54 ./
dr-xr-xr-x 9 zaralts zaralts  0 49 21:17 ../
lr-x------ 1 zaralts zaralts 64 49 21:54 0 -> /dev/null
lrwx------ 1 zaralts zaralts 64 49 21:54 1 -> 'socket:[39859]'
lrwx------ 1 zaralts zaralts 64 49 21:54 10 -> 'socket:[477522]'

/proc/sys/fs/inode-state

  • 第一列的值为已经分配的inode数量(nr_inodes)
  • 第二列的值为剩余可分配的inode数量(nr_free_inodes)
  • 第三列当nr_inodes > inode-max时为非 0(preshrink)
  • 后面三个为dummy values(总是为0)
$ cat /proc/sys/fs/inode-state                             
139193  25844   0       0       0       0       0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值