Cross-user a cross-process sdílených nastavení

hlasů
1

Mám dva procesy - uživatel proces a LaunchDaemon kořen úrovni. Rád bych oba procesy mají společné nastavení. Snažil jsem se dostat tuto práci přes SQLite databáze, ale narazit na problémy korupce. Přemýšlel jsem o použití NSUserDefaults, ale NSGlobalDomainzdá se, že pouze globální pro uživatele, a já potřebuju cross-user přetrvávající doménu, která NSUserDefaultsse nezdá poskytnout.

Snažil jsem se číst a psát XML soubor přímo, a můžu dostat, aby to fungovalo v pohodě s větším počtem vláken (prostřednictvím jednoduché NSLock), ale když jsem se pokusil aplikovat O_EXLOCKdo spisu, aby se zabránilo jeden proces od zápisu do souboru, zatímco druhá je, nezdá se do práce.

CFPreferencesZdá se, že většina ze stejných otázek, jako NSUserDefaults. Tam je kCFPreferencesAnyUserkonstantní, ale dokumentace říká, že mohu použít jen to, že když budu mít oprávnění správce (které uživatel proces nemá).

Takže moje otázka zní takto:

Jak lze efektivně realizovat křížovou proces a cross-uživatelská nastavení sdílené?

Položena 26/08/2009 v 23:02
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Nejlepším řešením je zřejmě O_EXLOCKpřístup, zabalené do NSFileHandle pro pohodlí ( -initWithFileDescriptor:). Něco takového (nevyzkoušené, nezkompilovaný):

Psaní:

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

Čtení:

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

Samozřejmě to bude blokovat, takže budete muset použít O_NONBLOCK nebo dát je na non-UI závitem tak, aby vaše GUI aplikace nemá Beachball.

V čem je problém vidíte s O_EXLOCK?

Odpovězeno 26/08/2009 v 23:38
zdroj uživatelem

hlasů
1

Všimněte si, že použití O_EXLOCKa O_SHLOCKse open(2 )právě umožňuje vyhnout volání flock(2 ). Mac OS X podporuje pouze poradní zamykání, a jako manuálové pro flock()poznámky:

Poradenské zámky umožňují spolupracující procesy provádět konzistentní operace se soubory, ale nezaručují soulad (tj procesy mohou stále přistupovat k souborům bez použití poradenské zámků možná což má za následek nekonzistence).

Budete se dostanete do problémů, pak, pokud obě aplikace nejsou pokaždé, když otevřete soubor poradní uzamčen zvolilo do poradenského zamykání.

Můžete také zkusit mít uživatel proces, aby nesplácení volání přes démona pomocí RPC. To by pak zvládnout všechny výchozí psaní jménem klientských aplikací; Výchozí čtení by už zasáhnout každý uživatel, aktuální hostitele / jakékoliv hostitelské výchozí.

Odpovězeno 03/09/2009 v 20:18
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more