Cross-utilisateur et les paramètres partagés inter-processus

voix
1

J'ai deux processus - un processus utilisateur et un LaunchDaemon niveau racine. Je voudrais les deux processus d'avoir les paramètres partagés. J'ai essayé d' obtenir cela fonctionne via une base de données SQLite, mais se sont heurtées à des problèmes de corruption. J'ai pensé à utiliser NSUserDefaults, mais NSGlobalDomainsemble être que globale pour l'utilisateur, et je besoin d' un domaine persistant inter-utilisateur, ce qui NSUserDefaultsne semble pas fournir.

J'ai essayé de lire et d' écrire un fichier XML directement, et je peux obtenir que cela fonctionne très bien avec plusieurs threads (via un simple NSLock), mais lorsque je tente d'appliquer un O_EXLOCKau fichier pour empêcher un processus d'écriture dans le fichier alors que le autre, il ne semble pas fonctionner.

CFPreferencessemble avoir la plupart des mêmes problèmes que NSUserDefaults. Il y a une kCFPreferencesAnyUserconstante, mais la documentation dit que je ne peux utiliser que si j'ai des privilèges d' administrateur (que le processus utilisateur ne dispose pas).

Voici donc ma question:

Comment puis-je mettre en œuvre efficacement inter-processus et paramètres partagés inter-utilisateur?

Créé 26/08/2009 à 23:02
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Votre meilleur pari est probablement l' O_EXLOCKapproche, enveloppé dans un NSFileHandle pour la commodité ( -initWithFileDescriptor:). Quelque chose comme ça (non testé, non compilé):

L'écriture:

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

En train de lire:

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

Bien sûr, ce bloqueront, vous devez donc utiliser O_NONBLOCK ou les mettre sur un fil non interface utilisateur de sorte que votre application GUI ne pas beachball.

Quel est le problème que vous voyez avec O_EXLOCK?

Créé 26/08/2009 à 23:38
source utilisateur

voix
1

Notez que l' utilisation O_EXLOCKet O_SHLOCKavec open(2 )vous permet simplement d' éviter un appel à flock(2 ). Mac OS X prend en charge que le verrouillage consultatif, et, comme pour manpage flock()notes:

Les verrouillages permettent de coopérer processus pour effectuer des opérations cohérentes sur les fichiers, mais ne garantissent pas la cohérence (c.-à-processus peuvent encore accéder à des fichiers sans utiliser les verrous consultatifs, entraînant éventuellement des incohérences).

Vous rencontrez des problèmes, puis, si les deux applications ne sont pas dans le système optent de verrouillage consultatif chaque fois qu'ils ouvrent le fichier verrouillé consultatif.

Vous pouvez également essayer d'avoir le processus utilisateur de faire des appels de valeurs par défaut via le démon à l'aide RPC. Il serait alors gérer tous par défaut écrit au nom des applications clientes; lecture par défaut serait déjà frappé les tout utilisateur, hôte actuel / tout défaut d'accueil.

Créé 03/09/2009 à 20:18
source utilisateur

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