2009-08-29 34 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