2009-08-29 16 views
7

¿Existe alguna manera programática de averiguar qué arquitectura está ejecutando otro proceso como en Mac OS X 10.5 y posterior?Determine la arquitectura de un proceso

Examinar el archivo de imagen del proceso no es una solución, ya que la imagen probablemente contenga varias arquitecturas, y entre las casillas de verificación de arco (1) y "Abrir en Rosetta" y "Abrir en modo de 32 bits", no hay forma de decir solo a partir de la imagen qué arquitectura se está ejecutando realmente.

+1

Definitivamente debería haber ... Activity Monitor hace exactamente eso. –

Respuesta

6

¿Se puede usar NSRunningApplication en sistemas operativos donde esté disponible, y volver a las cosas de sysctl cuando no es así? No creo que las cosas de Sysctl sean compatibles con API de la misma manera que la mayoría de las cosas, pero si solo lo estás utilizando en sistemas operativos antiguos, deberías estar bien.

Prueba esto para obtener el tipo de CPU del proceso:

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; 
     } 
    } 

Y prueba para comprobar si hay CPU_ARCH_ABI64 de 64 bits.

+0

'sysctl' es compatible con API. Eso parece prometedor; Te dejaré saber cómo funciona una vez que tenga la oportunidad de probarlo (ocupado con cosas más urgentes en este momento). –

+1

La función 'sysctl' no va a ninguna parte. Lo que está en la página de manualidades no va a ningún lado. Pero si haces 'sysctl -a', verás muchas otras cosas, incluido esto. Estos no son necesariamente compatibles. – Ken

+0

Justo lo que necesitaba. ¡Gracias! –

2

No dice cuáles son sus requisitos, pero la clase NSRunningApplication presentada en 10.6 ofrece una interfaz realmente fácil para esto. Los documentos están actualmente un poco fuera, pero está ahí.

+0

Se ve bien. Lamentablemente, estoy apuntando a Leopard. He editado mi pregunta para incluir esto. –

Cuestiones relacionadas