IT袋

当前位置:主页 > 经验教程 > 系统教程 >

Linux

Linux 下“Hello World”的幕后发生了什么(2)

时间:2023-09-17 20:02:06 来源:IT袋 作者:苏晓敏
导读:Linux,中查找。 对 execvp 的补充说明 如果你想要不用自己重新实现,而运行和 Shell 同样的 PATH 搜索逻辑,你可以使用 libc 函数 execvp (或其它一些函数名中含有

Linux

中查找。

对 execvp 的补充说明

如果你想要不用自己重新实现,而运行和 Shell 同样的PATH搜索逻辑,你可以使用 libc 函数execvp(或其它一些函数名中含有pexec*函数)。

3、stat 的背后运作机制

你可能在思考,Julia,stat到底做了什么?当你的操作系统要打开一个文件时,主要分为两个步骤:

  1. 它将文件名映射到一个包含该文件元数据的inode
  2. 它利用这个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  |................|

相关阅读