Pregunta

Estoy utilizando objetos distribuidos en mi solicitud para proporcionar una comunicación entre un pequeño programa agente de autenticación y la aplicación principal. La principal aplicación genera de NSTask, que a su vez invocar el programa de autenticación, que a su vez llamar de nuevo al programa principal para obtener algunas credenciales de usuario. Sé que suena complicado, pero tiene que trabajar de esta manera debido a la forma ssh obtiene contraseñas desde un programa en SSH_ASKPATH.

En mi aplicación principal que tengo una sola instancia de un objeto llamado PasswordDialog, que vend como sigue;

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

Esto sucede una vez cuando se inicia la aplicación.

En el agente de autenticación, que llamo de nuevo a este objeto de la siguiente manera;

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

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

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

El problema es que esto no funciona como me gustaría. Si hay varios agentes de autenticación ejecutar al mismo tiempo me parece que todos puedan acceder al mismo objeto y llamar al mismo método al mismo tiempo. Por ejemplo si pongo una declaración de registro en el comienzo de "responseForPID" y al final me sale una salida como ésta;

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

Lo que parece que hay tres procesos diferentes que entran en mi método en el mismo subproceso en un objeto con la misma dirección. Obviamente me falta un poco de comprensión fundamental de objetos distribuidos e hilos aquí, pero que parece como magia?

Así que finalmente llego a mi pregunta (s)

(a) puede alguien explicar lo que está pasando aquí (es decir, la forma en que puedo conseguir declaraciones que el anterior registro)

(b) Obviamente estoy usando objetos distribuidos de forma incorrecta para mi propósito. ¿Puede alguien sugerir cómo podría hacerlo correctamente.

Gracias y gracias por leer hasta el final de esta pregunta!


Editar: Solo para aclarar. Mi método "responseForPID" ve algo como esto;

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

}
¿Fue útil?

Solución

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>

Los PIDs son todas diferentes, lo que indica que los hilos se ejecutan en diferentes procesos.

Así que no, no hay acceso simultáneo al método en un solo hilo. Que los ID de hilo son los mismos, es probable coincidencia; ya que los tres procesos son relativamente simples y puesta en marcha de la misma manera, los hilos pasan a ser asignados en la misma dirección en cada uno (o, más probablemente, el hilo principal es siempre en la misma dirección por la naturaleza de la inicialización app).

Trate de imprimir [NSThread currentThread] cuando SPEW esas líneas de registro y no sólo la cadena del proceso remoto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top