2011-11-30 19 views
24

Quiero saber el directorio de trabajo de un proceso en Mac OS (10.6). Intenté encontrar la variable de entorno PWD en la salida del comando ps, pero la variable PWD no está disponible allí. ¿Hay alguna forma mejor de encontrar esto para un proceso en ejecución en mac?directorio de trabajo del proceso en ejecución en mac os

Respuesta

33

lsof -d cwd imprimirá los directorios de trabajo actuales para todos sus procesos. Si desea mostrar información sobre procesos que no le pertenecen, debe ejecutarlo como raíz (es decir, use sudo como prefijo). Si desea mostrar la información solo para ciertos programas o procesos, use, p. lsof -a -d cwd -c programname o lsof -a -d cwd -p processid (nota: en ambos casos, la bandera -a significa que las restricciones de las otras banderas obtienen "y" ed juntas). lsof es bastante complejo y tiene muchas más opciones, así que lea su página de manual para obtener más información.

+0

Exactamente lo que estaba buscando, gracias! – Aarkan

1

Si estamos hablando acerca de hacerlo dentro de un programa de cacao, esto va a funcionar:

NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; 
NSString *currentPath = [fm currentDirectoryPath]; 
5

Aunque Gordon Davisson's answer es grande, si quieres hacerlo desde código sin necesidad de llamar a lsof, aquí está el código necesitas. Está inspirado en la fuente lsof y this blog post.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <libproc.h> 

int main (int argc, char* argv[]) 
{ 
     int ret; 
     pid_t pid; 
     char pathbuf[PROC_PIDPATHINFO_MAXSIZE]; 
     struct proc_vnodepathinfo vpi; 

     if (argc > 1) { 
       pid = (pid_t) atoi(argv[1]); 
       ret = proc_pidpath (pid, pathbuf, sizeof(pathbuf)); 
       if (ret <= 0) { 
         fprintf(stderr, "PID %d: proc_pidpath();\n", pid); 
         fprintf(stderr, " %s\n", strerror(errno)); 
         return 1; 
       } 
       printf("proc %d executable: %s\n", pid, pathbuf); 
       ret = proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, 0, &vpi, 
            sizeof(vpi)); 
       if (ret <= 0) { 
         fprintf(stderr, "PID %d: proc_pidinfo();\n", pid); 
         fprintf(stderr, " %s\n", strerror(errno)); 
         return 1; 
       } 
       printf("proc %d cwd: %s\n", pid, vpi.pvi_cdir.vip_path); 
       // printf("proc %d root: %s\n", pid, vpi.pvi_rdir.vip_path); 
     } 

     return 0; 
} 

Este código de ejemplo producirá una salida como ésta:

proc 44586 executable: /bin/zsh 
proc 44586 cwd: /private/tmp 
+0

¿Dónde encontraste el código fuente OS X lsof? –

+0

https://opensource.apple.com/source/lsof/ – Charphacy

Cuestiones relacionadas