Mac OS X: Cómo obtener información detallada proceso (específicamente sus argumentos de lanzamiento) para las aplicaciones en ejecución arbitraria usando su PID

StackOverflow https://stackoverflow.com/questions/2838190

Pregunta

Estoy tratando de detectar cuando se inician las aplicaciones particulares.

Actualmente estoy usando NSWorkspace, su registro para la notificación "hizo aplicación de inicio". También utilizo el método runningApplications para obtener las aplicaciones que se están ejecutando cuando se inicia la aplicación.

Para la mayoría de aplicaciones, el nombre del paquete de aplicación es suficiente. Tengo un plist de "aplicaciones conocidas" que la comprobación cruzada con el nombre de ese pasado en la notificación.

Esto funciona bien hasta llegar a través de una aplicación que actúa como un proxy para lanzar otra aplicación utilizando argumentos de línea de comandos.

Ejemplo: El portal de la recién estrenada en el Mac no tiene un paquete de aplicación dedicada. El vapor puede crear un acceso directo, que sirve nada más que para poner en marcha la aplicación hl2_osx con el argumento -game y portal ya que de parámetro.

Desde más juegos basados ??Fuente se dirigen a la Mac, me imagino que vamos a usar el mismo método para puesta en marcha, funcionando con eficacia la aplicación hl2_osx con el argumento -game.

¿Hay una buena manera de obtener una lista de los argumentos (y sus parámetros) mediante una API Cocoa?

NSProcessInfo se acerca, ofreciendo un método `argumentos pueden mandarnoslos, pero sólo proporciona información para su propio proceso ...

ofertas NSRunningApplication la capacidad de obtener información acerca de aplicaciones arbitrarias utilizando un PID, pero sin argumentos de línea de comandos ...

¿Hay algo que llena el espacio entre los dos?

Estoy intentando no ir por el camino de desove un NSTask para funcionar ps -p [pid] y analizando la salida ... yo preferiría algo más alto nivel.

¿Fue útil?

Solución

Se puede usar cualquier usos ps, a pesar de que no es a base de cacao. De acuerdo con Singh , ps está basada en KVM y sysctl llamadas. Vierten sobre el fuente , las llamadas pertinant parecen ser kvm_openfiles , kvm_getprocs y kvm_getargv. Para obtener los argumentos de línea de comandos, primero kvm_openfiles llamada para obtener acceso al espacio de memoria del núcleo, a continuación, utilizar kvm_getprocs para obtener información del proceso del kernel, kvm_getargv.

El uso de sysctl en ps parece menos relevante para su objetivo; se utiliza para obtener otra información, como el ID de grupo y proces de ID principal. El nombre sysctl particular usado es {CTL_KERN, KERN_PROC, KERN_PROC_which, flags}, donde que especifica un filtro de proceso (por ejemplo ALL, PID) y banderas son argumentos para el filtro (los detalles están en el sysctl página del manual).

OS X no tiene procfs de apoyo, pero Singh desarrolló una versión basada FUSIBLE , publicada bajo licencia GPLv2. Si lo combinas con su solicitud, usted tiene que liberarlo bajo GPLv2 también. La mayor parte de MacFUSE se distribuye bajo una licencia BSD , por lo que se puede distribuir con su aplicación sin que sea de código abierto (fusefs / fuse_nodehash.c se distribuye bajo la licencia de código abierto de Apple, sino que también permite vincular a las aplicaciones de código cerrado).

La pregunta argv " Get otro proceso en OS X usando C " debe ser de uso, ya que tiene código de ejemplo usando KVM y sysctl. TN 2050 "La observación del proceso Tiempos de vida sin necesidad de consultar" también puede ser de utilidad para usted .

Otros consejos

No - corriendo ps es su mejor apuesta. Información del proceso estándar de interfaces no son compatibles con OS X (versiones NOOP se proporcionaron en OS X 10.4, pero a partir de entonces retirados) y las interfaces privadas es probable que el cambio entre OS X revisiones.

Si usted está dispuesto a encerrarse en una sola versión de OS X, todo el código fuente está disponible, por ejemplo, para ps o libproc ; También tendrá que ejecutar como root.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top