2009-08-26 6 views
1

私は、ユーザープロセスとルートレベルのLaunchDaemonという2つのプロセスを持っています。私は両方のプロセスが設定を共有したいと思います。私はsqliteデータベースを介して動作するようにこれを取得しようとしましたが、破損の問題が発生しました。私はNSUserDefaultsを使用することを考えましたが、NSGlobalDomainはユーザーのためだけにグローバルなようですが、私はクロスユーザー永続ドメインが必要です。NSUserDefaultsは提供していないようです。クロスユーザーとクロスプロセスの共有設定

XMLファイルを直接読み書きしようとしましたが、複数のスレッドでうまく動作するようになりました(NSLock)。O_EXLOCKを適用して1つのプロセスがファイルへの書き込みは、もう一方は、動作していないようです。

CFPreferencesは、ほとんど同じ問題をNSUserDefaultsとしているようです。 kCFPreferencesAnyUser定数がありますが、ドキュメントには管理者権限(ユーザープロセスにはない権限)がある場合にのみ使用できると記載されています。

だから私の質問はこれです:

どのように効果的にクロスプロセス、クロスユーザーに共有設定を実装することができますか?

答えて

2

おそらくO_EXLOCKのアプローチが便利です(-initWithFileDescriptor:)ためにNSFileHandleにラップされています。このような何か(未テスト;コンパイルされていない):

執筆:

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 

読書:あなたがO_NONBLOCKを使用するか、非上に置く必要があるので、これらは、ブロックします。もちろん

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 

あなたのGUIアプリケーションはビーチボールではないようにUIスレッド。

O_EXLOCKで見られる問題は何ですか? でO_EXLOCKO_SHLOCKを使用して

1

注意はちょうどあなたがへの呼び出しを避けることができます。マックOS Xのみ諮問ロックをサポートし、かつ、flock()ノートのマンページとして:

諮問ロックは(つまり、プロセスがまだ使用せずにファイルにアクセスする可能性のあるファイルに一貫性のある操作を実行するためのプロセスを連携することができますが、一貫性を保証するものではありませんおそらく矛盾の原因となるアドバイザリロック)。

アドバイザリロックされたファイルを開くたびに両方のアプリケーションがアドバイザリロックシステムを選択しないと、問題が発生します。

また、RPCを使用してデーモンを介してユーザーがデフォルトの呼び出しを行うようにすることもできます。次に、クライアントアプリケーションに代わってすべてのデフォルトの書き込みを処理します。デフォルトの読み取り値はすでに任意のユーザー、現在のホスト/すべてのホストのデフォルト値に達しています。

関連する問題