我有两个过程 - 一个用户进程和根级LaunchDaemon。 我想这两个进程有共享设置。 我试图得到这个通过SQLite数据库工作,但遇到了损坏问题。 我想过使用NSUserDefaults
,但NSGlobalDomain
似乎只对用户是全球性的,而我需要一个跨用户持久域,这NSUserDefaults
似乎并没有提供。
我试着读,直接写入一个XML文件,而我能得到这个工作的罚款多线程(通过一个简单的NSLock
),但是当我尝试将应用O_EXLOCK
的文件,以防止一个进程中写入文件而另一种是,它似乎并没有工作。
CFPreferences
似乎有大部分相同的问题NSUserDefaults
。 有一个kCFPreferencesAnyUser
不变,但文件说,我只能用,如果我有管理员权限(用户进程没有)。
所以我的问题是这样的:
我怎样才能有效地实现跨流程,跨用户的共享设置?
你最好的选择可能是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看到的问题?
请注意,使用O_EXLOCK
和O_SHLOCK
与open(
2 )
只是让你避免调用flock(
2 )
。 Mac OS X上只支持咨询锁,并且,作为手册页flock()
指出:
咨询锁允许协作进程对文件进行一贯作业,但不保证一致性(即进程可能仍然可以访问文件,而无需使用监视锁可能导致不一致)。
你会碰到的问题,那么,如果两个应用程序不必在每次打开咨询锁定的文件时,选择加入咨询锁定系统。
您也可以尝试让用户处理,通过使用RPC守护使默认调用。 然后,它会处理所有默认代表的客户端应用程序编写; 默认情况下阅读会已经打到任何用户,当前主机/任何主机的默认值。