2009-08-29 32 views
7

有沒有一種編程方法可以找出Mac OS X 10.5及更高版本上另一個進程正在運行的體系結構?確定進程的體系結構

檢查進程的映像文件不是一個解決方案,因爲該映像可能包含多個體繫結構,並且在arch(1)和「Rosetta打開」和「32位模式打開」複選框之間,沒有從圖像中單獨告訴哪個架構實際運行。

+1

絕對應該有...活動監視器正是這樣做的。 – 2009-08-29 01:44:46

回答

6

你可以在可用的操作系統上使用NSRunningApplication,當它不可用時可以回退到sysctl的東西?我不認爲sysctl的東西是大多數東西的支持API,但如果你只在舊的操作系統上使用它,你應該沒問題。

試試這個獲得進程的CPU類型:

cpu_type_t cpuType 
    size_t  cpuTypeSize; 
    int   mib[CTL_MAXNAME]; 
    size_t  mibLen; 
     mibLen = CTL_MAXNAME; 
    err = sysctlnametomib("sysctl.proc_cputype", mib, &mibLen); 
    if (err == -1) { 
     err = errno; 
    } 
    if (err == 0) { 
     assert(mibLen < CTL_MAXNAME); 
     mib[mibLen] = pid; 
     mibLen += 1; 

     cpuTypeSize = sizeof(cpuType); 
     err = sysctl(mib, mibLen, &cpuType, &cpuTypeSize, 0, 0); 
     if (err == -1) { 
      err = errno; 
     } 
    } 

和測試CPU_ARCH_ABI64檢查64位。

+0

'sysctl'支持API。看起來很有希望;一旦我有機會嘗試一下,我會讓你知道它是如何發生的(忙於更緊迫的事情)。 – 2009-09-03 09:34:59

+1

'sysctl'函數沒有去任何地方。手冊頁中的內容不會去任何地方。但是如果你使用'sysctl -a',你會看到很多其他的東西,包括這個。這些不一定支持。 – Ken 2009-09-03 14:31:26

+0

正是我需要的。謝謝! – 2010-12-03 18:39:39

2

你不會說你的要求是什麼,但在10.6中引入的NSRunningApplication類爲此提供了一個非常簡單的接口。文檔目前有點偏離,但它在那裏。

+0

看起來不錯。不幸的是,我瞄準了Leopard。我編輯了我的問題來包含這一點。 – 2009-08-29 02:04:39