1

アプリケーションで分散オブジェクトを使用して、小さな認証エージェント プログラムとメイン アプリケーション間の通信を提供しています。メイン アプリケーションは 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;

}
4

1 に答える 1

1
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 はすべて異なり、スレッドが異なるプロセスで実行されていることを示しています。

したがって、いいえ、単一のスレッドでメソッドへの同時アクセスはありません。スレッド ID が同じであることは、おそらく偶然です。3 つのプロセスは比較的単純で、同じ方法で起動するため、スレッドはたまたまそれぞれで同じアドレスに割り当てられます (または、アプリの初期化の性質により、メイン スレッドは常に同じアドレスに割り当てられる可能性が高くなります)。

[NSThread currentThread]リモートプロセスからの文字列だけでなく、これらのログ行を吐き出すときに印刷してみてください。

于 2009-09-27T00:27:00.620 に答える