1.14. 我怎样找到进程的相应可执行文件?

这个问题可以作为‘常见未回答问题’(‘Frequently Unanswered Questions’)的一 个好候选,因为事实上提出这个问题经常意味着程序的设计有缺陷。:)

你能作的‘最佳猜测’(‘best guess’)是通过审视‘argv[0]’的值而获得。如果 它包括一个‘/’,那么它可能是可执行程序的绝对或相对(对于在程序开始时的 当前目录而言)路径。如果不包括,那么你可以仿效shell对于‘PATH’变量的查 询来查找这个程序。但是,不能保证成功,因为有可能执行程序时‘argv[0]’是 一些任意值,也不排除这个可执行文件在执行后可能已经被更名或删除的情况。

如果所有你想做的只是能打印一个和错误消息一起出现的合适的名字,那么最好 的方法在‘main()’函数中将‘argv[0]’的值保存在全局变量中以供整个程序使 用。虽然没有保证说‘argv[0]’的值总是有意义,但在大多数情况下它是最好的 选择。

人们询问这个问题的最普通原因是意图定位他们程序的配置文件。这被认为是 不好的形式;包含可执行文件的目录应当*只*包含可执行文件,而且基于管理的 要求经常试图将配置文件放置在和可执行文件不同的文件系统。

试图做这个的一个比较不普通但更正规的理由是允许程序调用‘exec()’执行它 自己;这是一种用来完全重新初始化进程(比如被用于一些‘sendmail’的版本)的 办法(比如当一个守护程序捕获一个‘SIGHUP’信号)。

1.14.1. 那么,我把配置文件放在哪里里呢?

为配置文件安排正确的目录总是取决于你使用的Unix系统的特点; ‘/var/opt/PACKAGE’,‘/usr/local/lib’,‘/usr/local/etc’,或者任何其它一 些可能的地方。用户自定义的配置文件通常是在‘$HOME’下的以“.”开始的隐藏文件( 比如‘$HOME/.exrc’)。

从一个在不同系统上都能使用的软件包(package)的角度看,它通常意味着任何站 点范围(sitewide)的配置文件的位置有个已设定的缺省值,可能情况是使用一个在 配置脚本程序里的‘--prefix’选项(Autoconf 脚本程序集做这个工作)。你会希望允 许这个缺省值在程序执行时被一个环境变量重载。(如果你没使用配置脚本程序, 那么在编译时,将这个位置缺省值作为‘-D’选项放入项目文件(Makefile),或者 将其放入一个‘config.h’头文件,或做其它类似的工作)

用户自定义配置需要放置于一个在‘$HOME’下的文件名“.”打头的文件,或者 在需要多个配置文件时,建立文件名“.”打头的子目录。(在列目录时,文件名以 “.”打头的文件或目录缺省情况下被忽略。)避免在‘$HOME’建立多个文件,因 为这会造成非常杂乱的情况。当然,你也应该允许用户通过一个环境变量重载这个 位置。即使不能找到某个用户的配置文件,程序仍应当以适宜的方式执行。