IT袋

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

Linux

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

时间:2023-09-17 20:02:06 来源:IT袋 作者:苏晓敏
导读:Linux,今日IT小知识分享:Linux及下“Hello的内容,接下来IT袋网小编为大家介绍。 今天我在想 —— 当你在 Linux 上运行一个简单的 “Hello World” Python 程序时,发生了什么,就像

Linux

今日IT小知识分享:Linux及下“Hello的内容,接下来IT袋网小编为大家介绍。

今天我在想 —— 当你在 Linux 上运行一个简单的 “Hello World” Python 程序时,发生了什么,就像下面这个?

print("hello world")

这就是在命令行下的情况:

$ python3 hello.py
hello world

但是在幕后,实际上有更多的事情在发生。我将描述一些发生的情况,并且(更重要的是)解释一些你可以用来查看幕后情况的工具。我们将用readelfstraceldddebugfs/procltraceddstat。我不会讨论任何只针对 Python 的部分 —— 只研究一下当你运行任何动态链接的可执行文件时发生的事情。

0、在执行 execve 之前

要启动 Python 解释器,很多步骤都需要先行完成。那么,我们究竟在运行哪一个可执行文件呢?它在何处呢?

1、解析 python3 hello.py

Shell 将python3 hello.py解析成一条命令和一组参数:python3['hello.py']

在此过程中,可能会进行一些如全局扩展等操作。举例来说,如果你执行python3 *.py,Shell 会将其扩展到python3 hello.py

2、确认 python3 的完整路径

现在,我们了解到需要执行python3。但是,这个二进制文件的完整路径是什么呢?解决办法是使用一个名为PATH的特殊环境变量。

自行验证:在你的 Shell 中执行echo $PATH。对我来说,它的输出如下:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

当执行一个命令时,Shell 将会依序在PATH列表中的每个目录里搜索匹配的文件。

对于fish(我的 Shell),你可以在这里查看路径解析的逻辑。它使用stat系统调用去检验是否存在文件。

自行验证:执行strace -e stat bash,然后运行像python3这样的命令。你应该会看到如下输出:

stat("/usr/local/sbin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/bin/python3", {st_mode=S_IFREG|0755, st_size=5479736, ...}) = 0

你可以观察到,一旦在/usr/bin/python3找到了二进制文件,搜索就会立即终止:它不会继续去/sbin/bin

相关阅读