代码之家  ›  专栏  ›  技术社区  ›  Dave DeLong

跨用户和跨进程共享设置

  •  1
  • Dave DeLong  · 技术社区  · 15 年前

    我有两个进程——一个用户进程和一个根级启动守护进程。我希望两个进程都有共享设置。我曾尝试通过sqlite数据库实现这一点,但遇到了腐败问题。我考虑过使用 NSUserDefaults ,但 NSGlobalDomain 似乎只对用户是全局的,我需要一个跨用户的持久域,它 NSUserDefaults 似乎没有提供。

    我已经尝试过直接读取和写入XML文件,我可以通过多线程(通过一个简单的 NSLock O_EXLOCK 为了防止一个进程写入文件而另一个进程写入文件,它似乎不起作用。

    CFPreferences 似乎有很多和你一样的问题 NSUserDefaults kCFPreferencesAnyUser

    所以我的问题是:

    2 回复  |  直到 15 年前
        1
  •  2
  •   Rob Napier    15 年前

    你最好的选择可能是 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应用程序就不会成为海滩球。

        2
  •  1
  •   Jeremy W. Sherman    15 年前

    注意,使用 O_EXLOCK O_SHLOCK 具有 open( 2. ) 只是让你避免打电话给 flock( 2. ) . Mac OS X仅支持建议锁定,并且,作为 flock() 笔记:

    咨询锁允许协作进程对文件执行一致的操作,但不能保证一致性(即,进程仍然可以在不使用咨询锁的情况下访问文件,这可能导致不一致)。

    那么,如果两个应用程序在每次打开咨询锁定文件时都没有选择进入咨询锁定系统,那么您将遇到问题。