IT袋

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

Linux

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

时间:2023-09-17 20:02:06 来源:IT袋 作者:苏晓敏
导读:Linux,好极了!我们找到了 inode!你可以在里面看到 python3 ,这是一个很好的迹象。我们并不打算深入了解所有这些,但是Linux 内核的 ext4 inode 结构指出,前 1

Linux

好极了!我们找到了 inode!你可以在里面看到python3,这是一个很好的迹象。我们并不打算深入了解所有这些,但是Linux 内核的 ext4 inode 结构指出,前 16 位是 “模式”,即权限。所以现在我们将看一下ffa1如何对应到文件权限。

  • ffa1对应的数字是0xa1ff,或者 41471(因为 x86 是小端表示)
  • 41471 用八进制表示就是0120777
  • 这有些奇怪 – 那个文件的权限肯定可以是777,但前三位是什么呢?我以前没见过这些!你可以在inode 手册页中找到012的含义(向下滚动到“文件类型和模式”)。这里有一个小的表格说012表示 “符号链接”。

我们查看一下这个文件,确实是一个权限为777的符号链接:

$ ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 9 Apr  5  2021 /usr/bin/python3 -> python3.9

它确实是!耶,我们正确地解码了它。

4、准备复刻

我们尚未准备好启动python3。首先,Shell 需要创建一个新的子进程来进行运行。在 Unix 上,新的进程启动的方式有些特殊 – 首先进程克隆自己,然后运行execve,这会将克隆的进程替换为新的进程。

自行验证:运行strace -e clone bash,然后运行python3。你应该会看到类似下面的输出:

clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f03788f1a10) = 3708100

3708100是新进程的 PID,这是 Shell 进程的子进程。

这里有些工具可以查看进程的相关信息:

  • pstree会展示你的系统中所有进程的树状图
  • cat /proc/PID/stat会显示一些关于该进程的信息。你可以在man proc中找到这个文件的内容说明。例如,第四个字段是父进程的PID。

新进程的继承

新的进程(即将变为python3的)从 Shell 中继承了很多内容。例如,它继承了:

  1. 环境变量:你可以通过cat /proc/PID/environ | tr '' 'n'查看
  2. 标准输出和标准错误的文件描述符:通过ls -l /proc/PID/fd查看
  3. 工作目录(也就是当前目录)
  4. 命名空间和控制组(如果它在一个容器内)
  5. 运行它的用户以及群组
  6. 还有可能是我此刻未能列举出来的更多东西

5、Shell 调用 execve

现在我们准备好启动 Python 解释器了!

相关阅读