Question

Je suis en utilisant les objets distribués dans ma demande pour assurer la communication entre un petit programme d'agent d'authentification et l'application principale. La principale application engendre NSTask, ce qui à son tour appeler le programme d'authentification, ce qui rappellera au programme principal pour obtenir des informations d'identification utilisateur. Je sais que cela semble compliqué, mais il doit travailler de cette façon à cause de la façon dont ssh obtient les mots de passe d'un programme SSH_ASKPATH.

Dans ma demande principale que j'ai une seule instance d'un objet appelé PasswordDialog, que je Vend comme suit:

PasswordDialog *vendedPasswordDialog=[[PasswordDialog alloc] init];  
[[NSConnection defaultConnection] setRootObject:vendedPasswordDialog];
[[NSConnection defaultConnection] registerName:@"MyConnectionName"]

Cela se produit une fois que lorsque l'application démarre.

Dans l'agent d'authentification, je rappelle à cet objet comme suit:

NSConnection *passwordDialogConnection = [NSConnection connectionWithRegisteredName:@"MyConnectionName" host:nil];

PasswordDialog *pdProxy = (PasswordDialog*)[passwordDialogConnection rootProxy];

NSString *responseStr = [pdProxy responseForPID:pidString host:hostnameString user:usernameString processInfo:[NSProcessInfo processInfo]];

Le problème est que cela ne fonctionne pas comme je le voudrais. Si plusieurs agents d'authentification exécutant simultanément je trouve qu'ils peuvent accéder à tous le même objet et appeler la même méthode simultanément. Par exemple, si je mets une déclaration de journal au début de « responseForPID » et à la fin je reçois sortie comme ceci:

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

Ce qui semble comme il y a trois processus différents qui entrent dans ma méthode sur le même thread sur un objet avec la même adresse. Il est évident que je manque une compréhension fondamentale des objets distribués et les fils ici, mais qui semble comme par magie?

Alors finalement j'arrive à ma question (s)

(a) quelqu'un peut-il expliquer ce qui se passe ici (à savoir comment je peux obtenir de consigner les instructions comme ci-dessus)

(b) De toute évidence, je suis en utilisant des objets distribués de façon incorrecte pour mon but. Quelqu'un peut-il suggérer comment je pourrais le faire correctement.

Merci et merci pour la lecture à la fin de cette question!


Edit: Juste pour clarifier. Ma méthode « responseForPID » ressemble à quelque chose comme ça;

- (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;

}
Était-ce utile?

La solution

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>

Les PID sont toutes différentes, ce qui indique que les fils exécutent dans différents processus.

Alors, non, il n'y a pas un accès simultané à la méthode sur un seul thread. Que les ID de fil sont les mêmes est probablement une coïncidence; étant donné que les trois processus sont relativement simples et le démarrage de la même façon, les fils se trouvent être attribués à la même adresse dans chaque (ou, plus probablement, le fil conducteur est toujours à la même adresse par la nature de l'initialisation de l'application).

Essayez d'imprimer [NSThread currentThread] lorsque vous crachez ces lignes de journaux et non pas seulement la chaîne du processus distant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top