Linux C代码如何找到conf文件(通常在/ etc中)

时间:2011-02-20 08:02:43

标签: c linux project

我知道当我从源代码安装Linux应用程序时,执行./configure --sysconfdir=/etc,然后此应用程序的conf文件(例如httpd.conf)将转到/etc

从源代码的角度来看,源代码在解析时如何知道conf文件在/etc下。我的意思是像fopen("/../../app.conf", "r");这样的代码在我们安装之前确定,配置文件是否会改变源代码或其他机制?

2 个答案:

答案 0 :(得分:5)

configure脚本将生成必要的Makefile,它将使用C编译器的-DMACRO=content功能基本上将C预处理器#define MACRO content语句注入编译单元。因此,sysconfdir可以通过制定规则使用:

foo.o: foo.c
        $(CC) -DCONFDIR=$(sysconfdir) -o $@ $<

(这表示在foo.o更新时构建foo.c目标文件;要构建它,使用$(CC)变量运行C编译器,定义CONFDIR $(sysconfdir)的内容(通过./configure脚本提供),将输出放入目标文件($@)并将源文件($<)作为单独输入编译器。))

然后foo.c中的C代码可以像这样使用它:

 FILE *conf;
 if (conf = fopen(CONFDIR "/foo", "r")) {
     /* read config file */
 } else {
     /* unable to open config, either error and die or supply defaults */
 }

注意在编译程序之前执行C string concatenation - 非常方便这种用途。

此处有更多详情:http://www.gnu.org/software/hello/manual/autoconf/Installation-Directory-Variables.html#Installation-Directory-Variables

答案 1 :(得分:1)

执行./configure时,它通常会生成一个包含C编译器命令选项的makefile。这些选项将包括-D...选项(实际上)“#define”各种CPP符号。其中一个将具有您在运行./configure --sysconfdir=/etc时提供的“/ etc”值。

从那里,“/ etc”字符串被编译到源代码使用#defined符号的任何地方的代码中。