gpt4 book ai didi

objective-c - 跨用户和跨进程共享设置

转载 作者:行者123 更新时间:2023-12-03 17:00:36 24 4
gpt4 key购买 nike

我有两个进程 - 一个用户进程和一个根级 LaunchDaemon。我希望两个进程具有共享设置。我尝试通过 sqlite 数据库让它工作,但遇到了损坏问题。我考虑过使用 NSUserDefaults,但是 NSGlobalDomain 似乎只对用户是全局的,我需要一个跨用户持久域,其中 NSUserDefaults/code> 似乎没有提供。

我尝试过直接读取和写入 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 中遇到什么问题?

关于objective-c - 跨用户和跨进程共享设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com