2016-11-15 79 views
0

我正在尋找一種方式來獲得在Mac上所有運行的進程,滿足以下要求:編程讓所有正在運行的進程列表在Mac

1)所有進程(系統和用戶)

2.)給定供應商流程的唯一流程名稱。例如,來自兩個供應商的應用程序可能具有相同的進程名稱(如Activity Monitor中所示)。用下面的代碼,bundleIdentifier會給出一個唯一的名字。活動監視器可能會顯示具有相同進程名稱的多個進程,但該進程名稱對於該進程是唯一的。

3.)如果過程具有窗口

下面的代碼將執行圖2和3,但不爲1(它只是變得用戶的進程)。

for (NSRunningApplication app in [[NSWorkspace sharedWorkspace] runningApplications]) { 
    NSString *uniqueName = app.bundleIdentifier; 
    BOOL hasWindow = (app.activationPolicy == NSApplicationActivationPolicyRegular)?YES:NO; 
} 

有沒有人知道另一種方式來滿足所有3個要求?

+0

你能詳細說明你需要#2嗎?該系統例如啓動mdworker等多個進程並行工作,因此這實際上是不可能的。但是,根據你實際要做的事情,可能存在對你來說「足夠獨特」的標識符。例如。如果您只是想在運行時跟蹤進程,則可以使用PID,但這是隨機的,只在運行時纔有效。路徑可以改變(即使在一個進程正在運行時),但對某些使用情況可能足夠好... – uliwitness

+0

如果您需要在Mac上查找所有窗口(針對當前用戶),請查看CGWindowList。 ISTR他們可以爲您提供每個窗口的PID,您可以使用它們將它們與從別處獲得的過程列表相關聯。我認爲他們甚至包括一個你可以向用戶展示的進程名(但是沒有一個足夠用於#2)。 – uliwitness

回答

0

請從Darwin Sources檔案庫中將ps的源代碼(它將被隱藏在系統工具檔案之一中,而不是它自己的)中並從那裏開始。

這會讓你(1)。 (2)是不可能的;兩個進程可以具有相同的名稱(但每個進程必須具有唯一的PID--使用該進程)。

(3)您必須以某種方式去掠奪窗口服務器。我想可能是GitHub上有關於如何做到這一點的片段。

+0

我會換個#2。需要一種方法來區分不同供應商的兩個進程名稱。 – user3564870

相關問題