仅给出将要运行的程序的名称,Unix 如何知道它的绝对路径?

仅给出将要运行的程序的名称,Unix 如何知道它的绝对路径?

我假设它与创建要运行的程序时有关,它与创建它的工作目录相关联?

答案1

假设您在没有完整路径或相对路径的情况下调用程序,并且该程序不是函数或内置程序,则它必须位于您的 PATH 环境变量中才能找到。

3.7.2 命令查找与执行

Bash 使用哈希表来记住可执行文件的完整路径名,以避免多次 PATH 搜索(请参阅 Bourne Shell 内置函数中对哈希的描述)。仅当在哈希表中未找到该命令时,才会对 $PATH 中的目录执行完整搜索。如果搜索不成功,shell 将搜索名为 command_not_found_handle 的已定义 shell 函数。如果该函数存在,则会在单独的执行环境中调用它,并使用原始命令和原始命令的参数作为其参数,并且该函数的退出状态将成为该子 shell 的退出状态。如果未定义该函数,shell 将打印一条错误消息并返回退出状态 127。

答案2

当执行程序时,调用程序(通常是 shell)按照惯例在PATH环境变量中列出的目录中搜索该程序。为此,调用程序可以使用execlpexecvp、 或等库函数execvpe来执行搜索,或者调用程序本身可以实现类似的逻辑。

库函数最终调用execve系统调用,这是实际执行程序的主力。该execve调用将文件名作为第一个参数,它是包含程序的文件的名称。该名称通常是文件的绝对路径,但也可以是相对路径。在这种情况下,文件的搜索是从进程的当前目录开始的。 (请注意,该文件不一定包含在当前目录中:例如,名称可以是 。../../myprogramexecve系统调用不关心PATH环境变量。

那么,如果给系统调用一个相对路径,内核如何知道程序的绝对路径呢execve?答案是不会,也没有必要。

相关内容