문제

저는 작은 인증 에이전트 프로그램과 기본 애플리케이션 간의 통신을 제공하기 위해 애플리케이션에서 분산 개체를 사용하고 있습니다.기본 응용 프로그램은 NSTask를 생성하고 인증 프로그램을 호출한 후 다시 기본 프로그램을 호출하여 일부 사용자 자격 증명을 얻습니다.복잡하게 들리겠지만 ssh가 SSH_ASKPATH의 프로그램에서 비밀번호를 가져오는 방식 때문에 이런 방식으로 작동해야 합니다.

내 기본 응용 프로그램에는 다음과 같이 판매하는 PasswordDialog라는 개체의 단일 인스턴스가 있습니다.

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

이는 애플리케이션이 시작될 때 한 번 발생합니다.

인증 에이전트에서는 다음과 같이 이 객체를 콜백합니다.

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

동일한 주소를 가진 개체의 동일한 스레드에서 내 메서드를 입력하는 세 가지 다른 프로세스가 있는 것 같습니다.분명히 여기에서는 분산 객체와 스레드에 대한 기본적인 이해가 부족하지만 그게 마술처럼 보이나요?

그래서 결국 나는 내 질문에 도달합니다.

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

}
도움이 되었습니까?

해결책

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가 동일하다는 것은 우연일 가능성이 높습니다.세 프로세스는 상대적으로 간단하고 동일한 방식으로 시작되므로 스레드는 각각 동일한 주소에 할당됩니다(또는 앱 초기화 특성상 기본 스레드가 항상 동일한 주소에 있을 가능성이 더 높습니다).

인쇄해 보세요 [NSThread currentThread] 원격 프로세스의 문자열뿐만 아니라 해당 로그 줄을 분출할 때.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top