LINUX.ORG.RU

Конфиги, их формат и чтение

 , ,


0

1

Требуется моему приложению хранить настройки в конфиг файле и читать их оттуда. Не то чтобы это было какой-то проблемой в реализации, но подумалось мне что в дебиане этих конфигов триллионы и больше. Ну а раз их там так много то наверняка есть какой то стандарт их написания и стандартные алгоритмы для чтения.
Ну и собственно вопрос: есть ли эти стандарты? И если есть где их прочитать?

Ответ на: комментарий от Eddy_Em

Использовать можно вообще все что угодно.
Меня интересует именно стандарты. Есть ли какие-либо стандарты в формате кофигурационных файлов в linux'е? На json я вообще ни разу в жизни конфига не видел (хотя я как нуб видел не так уж и много).

rteer34
() автор топика
Ответ на: комментарий от rteer34

Что libconfig, что json - вполне себе стандарты для конфигов.

В плане выбора конкретного формата и реализации - каждый ... пишет как он хочет.

Dikar ★★
()
Ответ на: комментарий от rteer34

Есть ли какие-либо стандарты в формате кофигурационных файлов в linux'е?

Нет, конечно. Конфиг зависит от потребностей задачи. Есть, конечно, более-менее распространённые форматы, пригодные для многих программ. В основном, это вариации на темы .ini файлов.

На json я вообще ни разу в жизни конфига не видел

Calibre хранит в JSON. Naev хранит в LUA. OpenXCOM хранит в YAML.

redgremlin ★★★★★
()
Ответ на: комментарий от Dikar

Ок. Стандартов нет, я понял, каждый пишет как ему удобнее. Буду использовать libconfig.
Спасибо

rteer34
() автор топика
Ответ на: комментарий от rteer34

На json я вообще ни разу в жизни конфига не видел

transmission, например.

Deleted
()
Ответ на: комментарий от rteer34

Да нет там никаких стандартов. Каждый городит отсебятину. Самое популярное — конфиги вроде icewm'овского или mplayer'ского ("тип - значение").

Eddy_Em ☆☆☆☆☆
()

Кстати, да: простейшие конфиги я бы так и делал: переменная1=значение переменная2=значение ... Элементарно парсится при помощи strtok.

Если нужны блоки, то проще JSON.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

mplayer'ского («тип - значение»)

У mplayer'а не просто key=value.Он поддерживает списки для value (key=opt1=value1:opt2=value2:op3), профили [my-profile], ещё может что забыл. Так что там не просто парсер, а целая система управления опциями.

redgremlin ★★★★★
()

тут каждый строчит как захочет

я бы рассматривал свой конфиг как простенький DSL со всеми вытекающими последствиями.

json тоже хорош для этих целей, но:

- все с++ json парсеры убогие

- добиться вразумительных сообщений об ошибках сложнее

iddqd
()
Ответ на: комментарий от rteer34

json я вообще ни разу в жизни

transmission

anonymous
()
Ответ на: комментарий от Eddy_Em

Какой, нафиг, thread? Какие потоки в чтении файла конфигурации? Ты о чем вообще?

о том, что программы бывают многопоточными, и эти многие потоки могут дергать strtok, и если они это сделают одновременно - будет кака. но если у тебя helloworld в 1 поток, и ты знаешь что так будет всегда — то без проблем, кушай на здоровье :)

waker ★★★★★
()
Ответ на: комментарий от waker

Это ж каким надо быть ССЗБ, чтобы читать конфиг одновременно из нескольких потоков? Что за бред? Ты читаешь в основном потоке, потом уже хоть fork делаешь, хоть запускаешь дочерние потоки... А основная конфигурация у тебя хранится в разделяемой памяти, скажем. В виде большой такой структуры.

Как, по-твоему, CGI работают? А там ведь тоже и потоки, и конфиги...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Это ж каким надо быть ССЗБ, чтобы читать конфиг одновременно из нескольких потоков?

зачем обязательно конфиг? мало ли для чего ты еще strtok применяешь.

waker ★★★★★
()
Ответ на: комментарий от Eddy_Em

Это ж каким надо быть ССЗБ, чтобы читать конфиг одновременно из нескольких потоков?

Мне вас жаль (С)

anonymous
()
Ответ на: комментарий от nanoolinux

man fopen, man fscanf, трололо.

Вы не прочитав (или не поняв) вопроса всегда вините не себя а написавшего? Особенно доставляет тот факт что все до и после вас отписавшиеся вопрос поняли и уже подсказали что к чему.

rteer34
() автор топика
Ответ на: комментарий от Eddy_Em

Это ж каким надо быть ССЗБ, чтобы читать конфиг одновременно из нескольких потоков?

Эдди, когда ж ты поумнеешь? Ты хоть когда-то ман на strtok() читал?

Pavval ★★★★★
()
Ответ на: комментарий от rteer34

Я прекрасно понял вопрос. json убог; libconfig не совместим ни с чем, кроме как с самим собой; для ini файлов нет стандарта, с чем лично мной писаные парсеры уже сталкивались много раз. Так что реальные пацаны выбирают что-то вроде file:consult вместе с нормальным языком програмирования, а не портабельным ассемблером, падающим от первого чиха, но быстро.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)

Linux

Стандарты

Хе-хе-хе.

CARS ★★★★
()
Ответ на: комментарий от waker

мало ли для чего ты еще strtok применяешь

Лично я его применяю для чтения конфигов и обработки POST-запросов в CGI. Ну и так, по-мелочи. Ясен пень, когда необходимо сохранить исходную строку, тупо делаешь strdup перед вызовом strtok. Тоже мне, проблема...

Eddy_Em ☆☆☆☆☆
()

iniparser как вариант

Harald ★★★★★
()
Ответ на: комментарий от Pavval

Нафига мне man читать? Я успешно пользуюсь этой функцией в своих самопальных обертках. И все превосходно работает.

И не надо мне рассказывать, что делает эта функция. Я знаю, что она делает. И знаю, что она модифицирует исходную строку.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

И знаю, что она модифицирует исходную строку.

проблема не в исходной строке. прочитай ман уже. там внутренний статик буфер (по сути глобальная переменная). без мутекса.

waker ★★★★★
()
Ответ на: комментарий от Eddy_Em

Нафига мне man читать?

Нет, сори конечно, но ты таки дурак. Специально, чтобы хоть как-то попробовать вбить тебе в голову знания, я приведу цитату из мана:

The strtok() function uses a static buffer while parsing, so it's not thread safe.

Т.е. ты не можешь вызывать strtok() одновременно из нескольких потоков (даже для разных строк!), потому что буфер все вызовы strtok() используют один и тот же - ты тупо словишь race condition.

Pavval ★★★★★
()
Ответ на: комментарий от waker

Да знаю я. Я ж тебе уже говорил, что в многопоточных приложениях я не использую strtok в нескольких потоках — только в основном.

Если мне бы понадобилось strtok из кучи потоков вызывать, я бы просто вызывал strtok_r.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Pavval

Я тут уже 100500-й раз твержу, что знаю про это! Читай лучше.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Если мне бы понадобилось strtok из кучи потоков вызывать, я бы просто вызывал strtok_r.

А если нет, то юзал бы strtok()? УПРЛС? Ну появится у тебя второй поток когда-то. Или внезапно какая-то левая либа учудит и заюзает strtok() где-то у себя. Любитель приключений.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

А если нет, то юзал бы strtok()?

Не "юзал бы", а юзаю. УМВР. Я ж не делаю какие-то мегакрутые БД. А в CGI нафиг не нужно параллельно обрабатывать что-то.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.