C source-code/script/program 是否使用类似 shebang 的命令?

Does a C source-code/script/program uses a shebang-like command?

这可能是个愚蠢的问题,但我还是会试试的:

当您将 shell 脚本转换为可执行文件时,它会使用 shebang 来了解您 运行 使用哪个解释器。 C code/script/program uses/has 有类似的东西吗?

可执行 C 程序的开头是否有任何幻数?

经过一些 google-ing,我想我理解了以下内容(尽管我不是 100% 确定):

某些编程语言,例如 bash、python、php 和其他语言使用解释器 - 因此可能需要 shebang。与编译器不同,解释器每次调用时都会将程序代码翻译成机器语言。

C 不使用解释器,而只使用编译器——它只将代码一次转换为可执行文件/目标文件。

所以答案是——不—​​—c 代码不需要 shebang。

是的。

C 程序可执行文件(和所有编译语言)以 "magic" 个字符 0x7f E L F 开头。 Linux 内核识别它的方式与识别 shebang 脚本的方式相同,只是它随后会触发 ELF 加载程序,而不是脚本解释器。

这不是 实际上 shebang,但它是类似的。

术语 "magic number" 实际上更适用于编译程序而不是脚本。在 shebang 被发明之前,已经有识别可执行文件的神奇数字。

幻数是固定偏移量(通常是文件的开头)处的任何短字节序列,旨在使程序能够快速确定文件的格式。有一个 ELF 幻数,一个 PNG 幻数数字,一个 gzip 幻数...

shebang 有点像模仿 幻数原理。

另外,在ELF中一个叫做ELF解释器的东西,内核必须知道,类似于脚本解释器。如果 ELF 可执行文件有解释器,内核将在解释器的入口点而不是主可执行文件的入口点启动程序。每个动态链接程序都使用此功能。动态链接器是ELF解释器。

shebangshell* 用来识别需要预先启动可执行程序的脚本,脚本将作为参数提供给该脚本。

例如名为 "myscript.pl" 的脚本,具有可执行访问权限

#!/usr/bin/perl
# perl script

shell 看到 #! 并开始这样的过程:

/usr/bin/perl myscript.pl

编译出来的C程序是可以直接执行的,"magic number"不是说is/was一个C程序。幻数意味着它是一个适合 OS 的特定可执行文件,然后可执行机器代码(从给定地址开始)将直接由 the/a 处理器执行。

*历史上,shell 负责检测 shebang。现在内核直接做它(见下面的评论)。