Как код Linux C находит файл conf (обычно в / etc) - PullRequest
4 голосов
/ 20 февраля 2011

Я знаю, что когда я устанавливаю приложение Linux из исходного кода, я выполняю ./configure --sysconfdir=/etc, тогда файл конфигурации этого приложения (например, httpd.conf) перейдет в /etc.

Но с точки зрения исходного кода , как исходный код узнает, что файл conf находится под /etc при его синтаксическом анализе.Я имею в виду, что код, подобный fopen("/../../app.conf", "r");, определяется до того, как мы его установим, будет ли существовать исходный код изменения файла конфигурации или какой-то другой механизм?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2011

Сценарий configure сгенерирует необходимые Makefile, которые будут использовать функциональность -DMACRO=content компилятора C для существенного внедрения операторов препроцессора C #define MACRO content в модули компиляции.Таким образом, sysconfdir может быть использовано через правила Make:

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

(Это говорит о том, что нужно создать объектный файл foo.o при обновлении foo.c; чтобы создать его, используйте переменную $(CC) длязапустите компилятор C, определите CONFDIR с содержимым $(sysconfdir) (предоставленным с помощью сценария ./configure), поместите вывод в целевой файл ($@) и передайте исходный файл ($<) как единственныйввод в компилятор.))

Тогда код C в foo.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 выполняется доКомпиляция программы - супер удобно именно для такого рода использования.

Подробнее здесь: http://www.gnu.org/software/hello/manual/autoconf/Installation-Directory-Variables.html#Installation-Directory-Variables

1 голос
/ 20 февраля 2011

Когда вы выполняете ./configure, обычно генерируется make-файл, который включает параметры команды для компилятора C. Эти параметры будут включать -D... параметры, которые (по сути) "#define" различные символы CPP. Один из них будет иметь значение "/ etc", которое вы указали при запуске ./configure --sysconfdir=/etc.

Оттуда строка "/ etc" компилируется в код везде, где исходный код использует символ #defined.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...