Domanda

Sono utilizzando Distributed Objects nella mia richiesta per fornire la comunicazione tra un piccolo programma agente di autenticazione e l'applicazione principale. L'applicazione principale genera NSTask di, che a sua volta richiamare il programma di autenticazione, che a sua volta richiamare al programma principale per ottenere alcune credenziali dell'utente. So che suona complicata, ma deve lavorare in questo modo a causa del modo ssh ottiene le password da un programma in SSH_ASKPATH.

Nella mia domanda principale che ho una singola istanza di un oggetto chiamato PasswordDialog, che io vend come segue;

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

Questo succede una volta quando l'applicazione si avvia.

Nel agente di autenticazione, che io chiamo di nuovo a questo oggetto come segue:

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

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

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

Il problema è che questo non funziona come vorrei. Se ci sono più agenti di autenticazione Eseguendo contemporaneamente trovo che tutti possono accedere allo stesso oggetto e chiamare lo stesso metodo contemporaneamente. Per esempio, se ho messo una dichiarazione di registro, all'inizio della "responseForPID" e alla fine ho output come questo;

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

Il che sembra che ci sono tre diversi processi che entrano mio metodo sullo stesso thread su un oggetto con lo stesso indirizzo. Ovviamente mi manca un po 'di comprensione fondamentale di oggetti distribuiti e le discussioni qui, ma che sembra come per magia?

Così alla fine ottengo alla mia domanda (s)

(a) qualcuno può spiegare cosa sta succedendo qui (vale a dire come posso ottenere dichiarazioni come sopra log)

(b) Ovviamente sto usando gli oggetti distribuiti in modo non corretto per il mio scopo. Qualcuno può suggerire come potrei farlo correttamente.

Grazie e grazie per la lettura fino alla fine di questa domanda!


Modifica: Tanto per chiarire. Il mio metodo "responseForPID" sembra qualcosa di simile;

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

}
È stato utile?

Soluzione

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>

I PID sono tutte diverse, indicando che i fili sono in esecuzione in diversi processi.

Quindi, no, non c'è accesso simultaneo al metodo su un singolo filo. Che gli ID di thread sono gli stessi è probabile una coincidenza; poiché i tre processi sono relativamente semplici e inizia nello stesso modo, i fili capita di essere assegnato allo stesso indirizzo in ciascun (o, più probabilmente, il filo principale è sempre allo stesso indirizzo per la natura della inizializzazione app).

Provare a stampare [NSThread currentThread] quando si vomitare quelle linee di registro e non solo la stringa dal processo remoto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top