Межпользовательские и межпроцессные общие настройки - PullRequest
1 голос
/ 27 августа 2009

У меня есть два процесса - пользовательский процесс и LaunchDaemon корневого уровня. Мне бы хотелось, чтобы оба процесса имели общие настройки. Я пытался заставить это работать через базу данных sqlite, но столкнулся с проблемами коррупции. Я думал об использовании NSUserDefaults, но NSGlobalDomain кажется глобальным для пользователя, и мне нужен постоянный межпользовательский домен, который NSUserDefaults, по-видимому, не обеспечивает.

Я пытался читать и записывать XML-файл напрямую, и я могу заставить его нормально работать с несколькими потоками (через простой NSLock), но когда я пытаюсь применить O_EXLOCK к файлу, чтобы предотвратить один процесс от записи в файл, в то время как другой, похоже, не работает.

CFPreferences, похоже, имеет большинство тех же проблем, что и NSUserDefaults. Существует константа kCFPreferencesAnyUser, но в документации сказано, что я могу использовать ее только при наличии привилегий администратора (которых нет у пользовательского процесса).

Так что мой вопрос таков:

Как эффективно реализовать межпроцессные и межпользовательские настройки общего доступа?

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Ваша лучшая ставка - это, вероятно, подход O_EXLOCK, заключенный в NSFileHandle для удобства (-initWithFileDescriptor:). Примерно так (не проверено; не скомпилировано):

Запись:

int fd = open([path UTF8String], O_TRUNC|O_EXLOCK);
if (fd >= 0)
{
    NSFileHandle *fh = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES];
    [fh writeData:xmlData]; // Creating xmlData left as exercise for the reader
    [fh release];
}
else // Error stuff

Чтение:

int fd = open([path UTF8String], O_RDONLY|O_SHLOCK);
if (fd >= 0)
{
    NSFileHandle *fh = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES];
    NSData *xmlData = [fh readDataToEndOfFile];
    [fh release];
}
else // Error stuff

Конечно, они будут блокироваться, поэтому вам нужно использовать O_NONBLOCK или поместить их в поток, не относящийся к пользовательскому интерфейсу, чтобы ваше приложение с графическим пользовательским интерфейсом не бейсбольное.

Какую проблему вы видите с O_EXLOCK?

1 голос
/ 03 сентября 2009

Обратите внимание, что использование O_EXLOCK и O_SHLOCK с open( 2 ) просто позволяет избежать вызова на flock( 2 ). Mac OS X поддерживает только рекомендательную блокировку, а в качестве справочной страницы для flock() примечания:

Консультативные блокировки позволяют взаимодействующим процессам выполнять согласованные операции над файлами, но не гарантируют согласованность (т. Е. Процессы могут по-прежнему обращаться к файлам без использования консультативных блокировок, что может привести к несогласованности).

Тогда вы столкнетесь с проблемами, если оба приложения не будут подключаться к системе консультативной блокировки каждый раз, когда открывают файл, заблокированный по рекомендации.

Вы также можете попробовать заставить пользовательский процесс делать вызовы по умолчанию через демон с использованием RPC. Затем он будет обрабатывать все записи по умолчанию от имени клиентских приложений; чтение по умолчанию уже поразит любого пользователя, текущий хост / любой хост по умолчанию.

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