交用户和跨进程共享设置(Cross-user and cross-process shared se

2019-10-17 09:10发布

我有两个过程 - 一个用户进程和根级LaunchDaemon。 我想这两个进程有共享设置。 我试图得到这个通过SQLite数据库工作,但遇到了损坏问题。 我想过使用NSUserDefaults ,但NSGlobalDomain似乎只对用户是全球性的,而我需要一个跨用户持久域,这NSUserDefaults似乎并没有提供。

我试着读,直接写入一个XML文件,而我能得到这个工作的罚款多线程(通过一个简单的NSLock ),但是当我尝试将应用O_EXLOCK的文件,以防止一个进程中写入文件而另一种是,它似乎并没有工作。

CFPreferences似乎有大部分相同的问题NSUserDefaults 。 有一个kCFPreferencesAnyUser不变,但文件说,我只能用,如果我有管理员权限(用户进程没有)。

所以我的问题是这样的:

我怎样才能有效地实现跨流程,跨用户的共享设置?

Answer 1:

你最好的选择可能是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或把它们放在一个非UI线程使您的GUI应用程序不皮球。

什么是你与O_EXLOCK看到的问题?



Answer 2:

请注意,使用O_EXLOCKO_SHLOCKopen( 2 )只是让你避免调用flock( 2 ) 。 Mac OS X上只支持咨询锁,并且,作为手册页flock()指出:

咨询锁允许协作进程对文件进行一贯作业,但不保证一致性(即进程可能仍然可以访问文件,而无需使用监视锁可能导致不一致)。

你会碰到的问题,那么,如果两个应用程序不必在每次打开咨询锁定的文件时,选择加入咨询锁定系统。

您也可以尝试让用户处理,通过使用RPC守护使默认调用。 然后,它会处理所有默认代表的客户端应用程序编写; 默认情况下阅读会已经打到任何用户,当前主机/任何主机的默认值。



文章来源: Cross-user and cross-process shared settings