Linux 下“Hello World”的幕后发生了什么(2)
Linux
中查找。对 execvp 的补充说明
如果你想要不用自己重新实现,而运行和 Shell 同样的PATH搜索逻辑,你可以使用 libc 函数execvp(或其它一些函数名中含有p的exec*函数)。
3、stat 的背后运作机制
你可能在思考,Julia,stat到底做了什么?当你的操作系统要打开一个文件时,主要分为两个步骤:
- 它将文件名映射到一个包含该文件元数据的inode
- 它利用这个inode来获取文件的实际内容
stat系统调用只是返回文件的 inode 内容 —— 它并不读取任何的文件内容。好处在于这样做速度非常快。接下来让我们一起来快速了解一下 inode。(在 Dmitry Mazin 的这篇精彩文章 《磁盘就是一堆比特》中有更多的详细内容)
$ stat /usr/bin/python3
File: /usr/bin/python3 -> python3.9
Size: 9 Blocks: 0 IO Block: 4096 symbolic link
Device: fe01h/65025d Inode: 6206 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-08-03 14:17:28.890364214 +0000
Modify: 2021-04-05 12:00:48.000000000 +0000
Change: 2021-06-22 04:22:50.936969560 +0000
Birth: 2021-06-22 04:22:50.924969237 +0000
自行验证:我们来实际查看一下硬盘上 inode 的确切位置。
首先,我们需要找出硬盘的设备名称:
$ df
...
tmpfs 100016 604 99412 1% /run
/dev/vda1 25630792 14488736 10062712 60% /
...
看起来它是/dev/vda1。接着,让我们寻找/usr/bin/python3的 inode 在我们硬盘上的确切位置(在 debugfs 提示符下输入imap命令):
$ sudo debugfs /dev/vda1
debugfs 1.46.2 (28-Feb-2021)
debugfs: imap /usr/bin/python3
Inode 6206 is part of block group 0
located at block 658, offset 0x0d00
我不清楚debugfs是如何确定文件名对应的 inode 的位置,但我们暂时不需要深入研究这个。
现在,我们需要计算硬盘中 “块 658,偏移量 0x0d00” 处是多少个字节,这个大的字节数组就是你的硬盘。每个块有 4096 个字节,所以我们需要到4096 * 658 + 0x0d00字节。使用计算器可以得到,这个值是2698496。
$ sudo dd if=/dev/vda1 bs=1 skip=2698496 count=256 2>/dev/null | hexdump -C
00000000 ff a1 00 00 09 00 00 00 f8 b6 cb 64 9a 65 d1 60 |...........d.e.`|
00000010 f0 fb 6a 60 00 00 00 00 00 00 01 00 00 00 00 00 |..j`............|
00000020 00 00 00 00 01 00 00 00 70 79 74 68 6f 6e 33 2e |........python3.|
00000030 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |9...............|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000060 00 00 00 00 12 4a 95 8c 00 00 00 00 00 00 00 00 |.....J..........|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 2d cb 00 00 |............-...|
00000080 20 00 bd e7 60 15 64 df 00 00 00 00 d8 84 47 d4 | ...`.d.......G.|
00000090 9a 65 d1 60 54 a4 87 dc 00 00 00 00 00 00 00 00 |.e.`T...........|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
相关阅读
-
win11字体安装位置详细介绍 windows11字体怎么安装
为网友们详解win11字体安装位置详细介绍方面的知识,关于win11字体安装位置详细介绍 windows11字体怎么安装,下面为详细的介绍。 有一些小伙伴在安装win11字体后,找不到自己的字体安装在哪里
-
win10开机进不了系统怎么办 重装系统不停重启教程
小编为大家说一说win10开机进不了系统怎么办和重装系统不停重启教程的介绍,接下来小编为网友介绍。 在日常使用电脑的过程中,我们有时候会遇到电脑开机后进不了系统的情况,这是令人
-
游戏分辨率怎么调 英雄联盟游戏分辨率怎么调
本文导读:游戏分辨率怎么调的方法内容,关于游戏分辨率怎么调 英雄联盟游戏分辨率怎么调,接下来一起来看看吧。 最近不少的IT袋用户问分辨率是不是越高越好,其实不然,分辨率高并不
-
win10怎么设置屏幕不休眠 win10怎么关闭屏幕不休眠
今天介绍win10怎么设置屏幕不休眠的相关知识,win10设置屏幕不休眠共三步,只需在电脑睡眠设置中进行操作即可。具体步骤如下:


