hou*_*let 17 fhs libraries binary files
我正在尝试了解文件系统层次结构标准。我已经查找了二进制文件和库,据我目前的理解:
二进制文件是二进制格式的计算机可读代码文件,它们直接用位控制 CPU 和处理器。
库是各种程序可以使用的函数,为了方便起见——比如当你需要一个 PHP 的 Javascript 模块时。
这种理解是否正确?如果是,为什么我们仍然将库和二进制文件分开?有些库是二进制文件,对吧?并且一些二进制文件(cat、less、date、rm、cp 等)被使用和重用,就好像它们是库一样......有人可以帮助解释差异并帮助我为这两个词找到更好的定义吗?谢谢你。
Aus*_*arn 17
您的理解大部分是正确的,但还有一些额外的事情需要考虑:
/lib
将是编译为机器代码的库。cat
在 shell 脚本中使用了诸如调用库中的代码之类的东西,但它们不是 FHS 意义上的库,因为它们可以自己运行。由于这些要点,不编写标准文档的人中更常见的术语是:
目标文件:这些是本机编译的机器代码,但甚至可能无法运行或无法调用。.o
除非它们属于其他类别之一,否则它们通常具有扩展名,并且除了在构建软件时之外,在大多数系统上几乎从未见过。我在这里列出它们是因为它们对于理解下面的一些事情很重要。
可执行文件:这些文件主要由可以直接运行的自包含代码组成。它们可以专门被任一格式,可直接由内核(东西等进行加载的对象的文件cat
,bash
以及python
是所有这种类型的可执行文件),或者通过一些中介程序,它是本身可执行(的Minecraft被解释,pydoc
以及cowsay
是所有实施例这种类型的可执行文件)。第一种类型的可执行文件在 UNIX 系统上几乎从不具有文件扩展名,而第二种类型的可执行文件可能会也可能不会。这就是 FHS 所说的“二进制文件”。他们可以从其他可执行文件运行,但需要调用特殊功能调用它们(fork()
以及exec()
在C和C ++,东西出来的subprocess
Python 等中的模块)并作为单独的进程运行。
库:这些文件包含可以被另一个库或可执行文件调用的可重用代码。一旦库被加载(在谈论编译代码时称为“链接”),库中的代码(大部分)直接由其他代码调用,并在与调用它的代码相同的进程中运行。共有三种通用类型的库:
.a
扩展名。在编译的编程语言之外,静态库的概念并不真正存在。.so
在 UNIX 上通常带有扩展名(.dll
是 Windows 上的标准),它在运行时由使用它的可执行文件加载。您会在/lib
生产系统中找到的大部分内容是动态库。http.server
Python 标准库中的示例)。