文件描述符
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 4月 8 21:17 ./
524289 drwxr-xr-x 3 root root 4096 4月 2 16:31 ../
524792 -rw------- 1 zaralts zaralts 5848 4月 8 15:36 .bash_history
528764 -rw-r--r-- 1 zaralts zaralts 220 4月 2 16:31 .bash_logout
528762 -rw-r--r-- 1 zaralts zaralts 3771 4月 2 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 4月 9 21:54 ./
dr-xr-xr-x 9 zaralts zaralts 0 4月 9 21:17 ../
lr-x------ 1 zaralts zaralts 64 4月 9 21:54 0 -> /dev/null
lrwx------ 1 zaralts zaralts 64 4月 9 21:54 1 -> 'socket:[39859]'
lrwx------ 1 zaralts zaralts 64 4月 9 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