Cross-usuário e as configurações de processo cruzado compartilhados

votos
1

Eu tenho dois processos - um processo de usuário e uma LaunchDaemon no nível raiz. Eu gostaria ambos os processos para ter configurações compartilhadas. Eu tentei começar este trabalho através de um banco de dados SQLite, mas ter executado em problemas de corrupção. Já pensou em usar NSUserDefaults, mas o NSGlobalDomainparece ser apenas global para o usuário, e eu preciso de um domínio persistente pelo usuário cruz, que NSUserDefaultsnão parece oferecer.

Eu tentei ler e escrever um arquivo XML diretamente, e eu posso chegar a este trabalho muito bem com vários segmentos (através de um simples NSLock), mas quando eu tentar aplicar um O_EXLOCKpara o arquivo para evitar um processo de escrever para o arquivo enquanto o outro é, que não parecem funcionar.

CFPreferencesparece ter a maior parte das mesmas questões que NSUserDefaults. Há uma kCFPreferencesAnyUserconstante, mas a documentação diz que eu só posso usar que se eu tiver privilégios de administrador (que o usuário processo não tem).

Então, minha pergunta é esta:

Como posso implementar efetivamente cross-processo e configurações compartilhadas pelo usuário cruz?

Publicado 26/08/2009 em 23:02
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Sua melhor aposta é provavelmente a O_EXLOCKabordagem, envolvida em uma NSFileHandle por conveniência ( -initWithFileDescriptor:). Algo parecido com isto (não testado; uncompiled):

Escrevendo:

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

Leitura:

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

É claro que estes irão bloquear, então você precisa usar O_NONBLOCK ou colocá-los em um segmento não-UI para que o seu aplicativo GUI não BEACHBALL.

Qual é o problema que você está vendo com O_EXLOCK?

Respondeu 26/08/2009 em 23:38
fonte usuário

votos
1

Note que o uso O_EXLOCKe O_SHLOCKcom open(2 )apenas permite-lhe evitar uma chamada para flock(2 ). Mac OS X apenas suporta bloqueio consultivo, e, como a página de manual para flock()notas:

bloqueios de aconselhamento permitem cooperar processos para executar operações consistentes em ficheiros, mas não garantem a consistência (isto é, processos ainda pode aceder a ficheiros sem o uso de fechaduras de aconselhamento, possivelmente resultando em inconsistências).

Você vai correr em problemas, então, se ambos os aplicativos não estão optando para o sistema de bloqueio consultivo cada vez que abrir o arquivo bloqueado-consultivo.

Você também pode tentar ter o processo do usuário fazer defaults chamadas através do daemon usando RPC. Seria, então, lidar com todo padrão escrito em nome de aplicações do cliente; leitura padrão já teria atingido os padrões de qualquer usuário, host atual / qualquer host.

Respondeu 03/09/2009 em 20:18
fonte usuário

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