程序可能需要找到它启动时使用的可执行文件,以便重新启动相同的程序。它可能需要找到关联文件,无论是源文件还是构建时创建的文件,这些文件在运行时使用。
查找它们的方法首先是查看 argv[0]
。
如果该字符串包含斜杠,则按照惯例,它是可执行文件的文件名,其目录部分是包含可执行文件的目录。当程序不是通过 PATH
找到时,通常就是这种情况,这意味着它已构建但未安装,并且从构建目录运行。程序可以使用 argv[0]
文件名重新启动自身,并可以在其目录部分查找关联文件。如果该文件名不是绝对路径,则它是相对于程序启动时的工作目录的相对路径。
如果 argv[0]
不包含斜杠,则它是通过 PATH
找到其可执行文件的命令名称。程序应在 PATH
中的目录中搜索该名称,并将 . 解释为程序启动时当前的工作目录。
如果此过程找到了可执行文件,我们称找到它的目录为调用目录。程序应检查该目录中是否存在它需要的关联文件。
如果程序的执行文件通常在主构建目录的子目录中构建,并且主构建目录包含关联文件(可能包括子目录),则程序应查看调用目录的父目录,检查主构建目录应包含的关联文件和子目录。
如果调用目录不包含所需的内容,但可执行文件名是符号链接,则程序应尝试使用链接目标的包含目录作为调用目录。
如果此过程没有找到有效的调用目录 - 通常是通过 PATH
找到的已安装程序的情况 - 则程序应在程序的 makefile 安装它们的目录中查找关联文件。请参阅目录变量。
在 argv[0]
中提供有效信息是一种约定,而非保证。行为良好的启动其他程序(例如 shell)的程序会遵循该约定;在启动其他程序时,您的代码也应遵循该约定。但是,始终可以启动程序并在 argv[0]
中给出无意义的值。
因此,任何需要知道其可执行文件位置或其其他关联文件位置的程序,都应为用户提供环境变量来显式指定这些位置。
不要将特殊权限(例如使用 setuid
位)授予在以这种方式调用时将启发式搜索关联文件或其自身可执行文件的程序。 将该权限限制为在硬编码的安装位置(例如 /usr 和 /etc 下)查找关联文件的程序。
有关 PATH
的更多信息,请参阅 Bash 参考手册中的Bourne Shell 变量。