2014-01-11 29 views

回答

2

如果你只需要誰發動的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 
+0

糟糕,不會返回錯誤,看起來像;它會返回一個大小。定影。 – Wevah

+0

您的方法應該加上前綴,因爲它位於框架類的類別中。此外,由於'NSRunningApplication'僅代表由運行上面的代碼和,然後同一個用戶運行的應用程序,只有當前正在運行的應用程序的一個子集,該代碼並沒有真正做多的整體利益(但當然可以使用通過OP,如果他們首先獲取PID列表)。 – bbum

+0

如果他所關心的只是「運行應用程序」,那應該沒問題;他不清楚他是想要所有的流程還是隻需要應用。 :/ – Wevah

1

從NSRunningApplication的文檔:只跟蹤用戶應用程序;這不提供有關係統上每個進程的信息。

即,它不會給你所有的系統進程。

最接近你可以做的是從NSWorkspace抓住runningApplications。但這將是一個不完整的列表。

或者,您可以下潛到系統在活動監視器中使用的相同API。但那會很痛苦。或者你可以從NSTask啓動ps auxwww並解析輸出,也很痛苦。

+0

我已經使用runningApplications從NSWorkspace,但它返回NSRunningApplications的數組,所以我們回到我最初的問題。解析ps的輸出是一個相當聰明的提示,儘管... – user732274

+0

@ user732274問題是,'NSWorkspace'的'runningApplications'非常不完整;它只返回正在運行調用'runningApplications'的代碼的用戶正在運行的一小部分進程。 – bbum

+0

他需要所有的流程嗎?這個問題不是很清楚。 – Wevah