アプリケーションで分散オブジェクトを使用して、小さな認証エージェント プログラムとメイン アプリケーション間の通信を提供しています。メイン アプリケーションは NSTask を生成します。NSTask は認証プログラムを起動し、認証プログラムはメイン プログラムにコールバックしてユーザー資格情報を取得します。複雑に聞こえるかもしれませんが、ssh が SSH_ASKPATH 内のプログラムからパスワードを取得する方法があるため、このように動作する必要があります。
私のメイン アプリケーションには、PasswordDialog というオブジェクトのインスタンスが 1 つあります。これを次のように販売します。
PasswordDialog *vendedPasswordDialog=[[PasswordDialog alloc] init];
[[NSConnection defaultConnection] setRootObject:vendedPasswordDialog];
[[NSConnection defaultConnection] registerName:@"MyConnectionName"]
これは、アプリケーションの起動時に 1 回発生します。
認証エージェントでは、次のようにこのオブジェクトにコールバックします。
NSConnection *passwordDialogConnection = [NSConnection connectionWithRegisteredName:@"MyConnectionName" host:nil];
PasswordDialog *pdProxy = (PasswordDialog*)[passwordDialogConnection rootProxy];
NSString *responseStr = [pdProxy responseForPID:pidString host:hostnameString user:usernameString processInfo:[NSProcessInfo processInfo]];
問題は、これが私が望むように機能しないことです。複数の認証エージェントが同時に実行されている場合、それらはすべて同じオブジェクトにアクセスし、同じメソッドを同時に呼び出すことができます。たとえば、「responseForPID」の先頭にログ ステートメントを配置すると、最後に次のような出力が得られます。
beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
PID endMethod 4872848
PID endMethod 4882384
PID endMethod 3618848
同じアドレスを持つオブジェクトの同じスレッドで、私のメソッドに 3 つの異なるプロセスが入っているようです。明らかに、ここでは分散オブジェクトとスレッドの基本的な理解が欠けていますが、それは魔法のように思えますか?
だから最終的に私は私の質問に行きます
(a) 誰かがここで何が起こっているのか説明できますか (つまり、上記のログステートメントを取得する方法)
(b) 明らかに、目的のために分散オブジェクトを間違って使用しています。誰かが私がそれを正しく行う方法を提案できますか?
この質問を最後まで読んでくれてありがとう!
編集:明確にするために。私の「responseForPID」メソッドは次のようになります。
- (NSString*) responseForPID:(NSString*) pid host:(NSString*)hostname user:(NSString*) username processInfo:(NSProcessInfo*) info {
NSLog(@"beginMethod PID %@ on thread %@ for object %@",pid,[NSThread currentThread],self);
.... code to get the password
NSLog(@"PID endMethod %@",pid);
return passwordString;
}