LINUX.ORG.RU

[C++] файл конфигурации, разделяемый между процессами

 


0

1

Ищу сабж. Т.е. хочется чтоб изменения, внесенные одним процессом были видны в других процессах. Пока предполагаю использовать sqlite, но, сдается мне, это как из пушки по воробьям.


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

Singlton

а оно умеет разделяться между процессами?

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

Используй гномовский реестр

не вариант. не хочу привязываться к гному

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

они УЖЕ разделяемые. С этой проблемой на винфак. В Linux'е её никогда и не было

да что вы говорите?! а почему у меня не разделяются?

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

>да что вы говорите?! а почему у меня не разделяются?

2 причины:

1) у вас маздай

2) вы не умеете их готовить. Попробуйте open/close в одном из процессов. В cli вы также можете читать системный лог командой tail -f /var/log/syslog. Только не говорите, что этот файл принадлежит одному процессу.

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

>да что вы говорите?! а почему у меня не разделяются?

А как ты с ними работаешь?

anonymous
()

Посмотри в сторону boost::interprocess.

ratatosk
()

если конфигурация читается клиентом по его личной инициативе, время от времени - LDAP

если хочется как из пушки, извещать клиентов об изменениях конфигурации - то это SNMP

Требование «изменения, внесенные одним процессом были видны в других процессах» будет выполняться даже если эти процессы на разных компах :)

MKuznetsov ★★★★★
()

Задача поставлена очень общо. Может быть, shared memory?

Vamp
()

файлы + полинг или сообщения (msgsnd/msgrcv)

gadfly ★★
()

> файл конфигурации, разделяемый между процессами

хочется чтоб изменения, внесенные одним процессом были видны в других процессах

Давным давно придумали, чтобы демон перечитал конфиг, ему отправляют сигнал (так работают большинство /etc/init.d/daemon reload). Он заново считывает конфиг, закрывает и заново открывает файлы логов... Где при этом лежит конфиг (в файле, базе или в разделяемой памяти) не имеет значения. Ты можешь использовать для разных процессов один файл конфигурации, и когда один его меняет, то он должен другому отправлять сигнал (для этого надо только PID'ы обоих процессов где-то хранить).

Или у тебя какая-то специфика?

anonymous
()

хорошо. похоже пора направить русло обсуждения немного в другую сторону. объясню на примере: есть файл configrc, изначально в нем записано:

a=0

b=0

запускаем процесс 1 (использует libconfig, парсит файл в начале работы, записывает в конце) он записывает a=1 и далее делает свои дела. в это время запускается процесс 2 (тоже использует libconfig) он записывает b=1 и завершает свою работу (изменения конфигов сбрасываются на диск). через какое-то время завершает свою работу процесс 1. в итоге имеем файл configrc следующего содержания:

a=1

b=0

все выглядит так, будто процесс 2 и не запускался. соответственно ищу библиотеку умеющую разруливать подобную ситуацию.

P.S. про *notify, shmem, sendmsg и тому подобные я знаю, но неужели нет библиотеки, работающих с ними?

P.P.S. вроде QSettings это умеет, но тянуть Qt ради конфигов...

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

Всё таки используй QT и кроссплатформенно и фреймфоркнуто, всё по моде :-)

да, будешь ждать исправлений багов как манны небесной. зато в тренде :-)

хочешь дёшево, просто, и поддерживаемо - делай сам.

spigel
()
Ответ на: комментарий от Torvus

Вам уже предлагали Singleton, чем не устраивает? Из любого места программы можно дотянуться до конфига. Я такой подход использую, внутри xml-файл, вы можете использовать любой метод хранения данных, как их распарсить/прочитать/сохранить - другой вопрос.

braboar
()
Ответ на: комментарий от Torvus

запускаем процесс 1 (использует libconfig, парсит файл в начале работы, записывает в конце) он записывает a=1 и далее делает свои дела. в это время запускается процесс 2 (тоже использует libconfig) он записывает b=1 и завершает свою работу (изменения конфигов сбрасываются на диск).

на самом деле происходит другое: процесс 2 удаляет файл, и создаёт новый. Причём с тем-же именем. На диске в этот момент находится два файла:

1) старый удалённый файл, который на самом деле ещё не удалён, ибо его держит процесс 1

2) новый файл, который держит процесс 2

Эту ситуацию можно легко смоделировать:

ksu@ksu:~$ cat >z
#!/bin/sh
sleep 1h
ksu@ksu:~$ z &
[1] 17997
ksu@ksu:~$ sed -i 's/1h/10h/' z
ksu@ksu:~$ cat z
#!/bin/sh
sleep 10h
ksu@ksu:~$ z &
[2] 18006
ksu@ksu:~$ lsof | grep '/home/ksu/z'
z         17997        ksu  255r      REG       8,26        19 1311181 /home/ksu/z (deleted)
z         18006        ksu  255r      REG       8,26        20 1311204 /home/ksu/z
ksu@ksu:~$ 
drBatty ★★
()
Ответ на: комментарий от Torvus

>хотелось бы кроссплатформенное готовое решение

ну в силу того, что тупой маздай до сих пор однопользователский, и однозадачный, я могу вам только посоветовать привинтить к нему многозадачный костыль. Например СУБД. Другого пути нет. Ну или ждите, пока в мысы таки добавят многозадачность. Причём полностью.

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

>ksu@ksu:~$ sed -i 's/1h/10h/' z

в этом месте маздай жалобно взвоет «не могу удалить файл. многозадачность детектед! завершите процесс z, и тогда я смогу что-то с ним сделать!»

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