어떻게이 정보를 검색 할 수 있습니까? NSRunningApplication
인스턴스가 주어지면 누구에게 공개했는지 알아야합니다. 활동 모니터는이 정보를 표시합니다.NSRunningApplication을 시작한 사용자 찾기
답변
는 여기를해야 카테고리 방법입니다 :
#import <libproc.h>
#import <pwd.h>
@implementation NSRunningApplication (UserName)
- (NSString *)foo_userName {
pid_t pid = [self processIdentifier];
struct proc_bsdshortinfo info;
proc_pidinfo(pid, PROC_PIDT_SHORTBSDINFO, 0, &info, sizeof(info));
struct passwd *passwd = getpwuid(info.pbsi_uid);
return [NSString stringWithUTF8String:passwd->pw_name];
}
@end
NSRunningApplication의 설명서에서 : 사용자 응용 프로그램 만 추적됩니다. 이 정보는 시스템의 모든 프로세스에 대한 정보를 제공하지 않습니다.
e.e. 시스템에서 모든 프로세스를 제공하지는 않습니다.
가장 가까운 방법은 runningApplications
을 NSWorkspace
에서 가져 오는 것입니다. 그러나 그것은 불완전한 목록 일 것입니다.
또는 Activity Monitor에서 시스템이 사용하는 것과 동일한 API로 다이빙 할 수 있습니다. 그러나 그것은 고통스러워 할 것입니다. 또는 NSTask에서 ps auxwww
을 시작하고 출력을 파싱 할 수도 있습니다. 방금 NSRunningApplication
의 인스턴스를 시작한 사용자의 이름을해야하는 경우
이미 NSWorkspace에서 runningApplications를 사용하지만 NSRunningApplications의 배열을 반환 그래서 우리는 나의 초기 질문으로 돌아 간다. ps의 출력을 구문 분석하는 것은 꽤 현명한 팁이지만 ... – user732274
@ user732274 문제는 NSWorkspace의'runningApplications'가 매우 불완전하다는 것입니다. 'runningApplications'를 호출 한 코드를 실행하는 사용자로 실행중인 프로세스의 작은 하위 집합 만 반환합니다. – bbum
그는 모든 프로세스가 필요합니까? 그 질문에 대해서는 그다지 명확하지 않습니다. – Wevah
죄송합니다. 오류를 반환하지 않습니다. 대신 크기를 반환합니다. 고정. – Wevah
메서드는 프레임 워크 클래스의 범주에 있으므로 접두사가 있어야합니다. 또한 'NSRunningApplication'은 위의 코드를 실행하는 동일한 사용자가 실행하는 앱만 표시하므로 현재 실행중인 앱의 하위 집합 만 표시하므로이 코드는 전체적으로 많은 관심을 끌지는 못합니다 (그러나 확실히 사용할 수 있습니다 그들이 PID의 목록을 먼저 잡으면 OP로). – bbum
그가 관심을 갖고있는 것이 "실행중인 응용 프로그램"이라면 괜찮을 것입니다. 그는 그가 모든 과정을 원하거나 단순히 applcations를 원하는지에 대해 아주 분명하지 않습니다. :/ – Wevah