2011-11-30 13 views
24

Desidero conoscere la directory di lavoro di un processo su Mac OS (10.6). Ho provato a trovare la variabile di ambiente PWD nell'output del comando ps, ma la variabile PWD non è disponibile lì. C'è un modo migliore per trovare questo per un processo in esecuzione su Mac?directory di lavoro del processo in esecuzione su mac os

risposta

33

lsof -d cwd stamperà le directory di lavoro correnti per tutti i processi. Se vuoi mostrare informazioni sui processi che non possiedi, devi eseguirlo come root (ad esempio, utilizza sudo come prefisso). Se desideri mostrare le informazioni solo per determinati programmi o processi, utilizza ad es. lsof -a -d cwd -c programname o lsof -a -d cwd -p processid (nota: in entrambi i casi, il flag -a significa che le restanti restrizioni degli altri flag diventano "ed" ed insieme). lsof è piuttosto complesso e ha molte più opzioni, quindi leggi la sua pagina man per maggiori informazioni.

+0

Esattamente quello che stavo cercando, grazie! – Aarkan

1

Se si sta parlando di farlo all'interno di un programma di cacao, questo funzionerà:

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

Anche se Gordon Davisson's answer è grande, se si vuole farlo da codice senza chiamando a lsof, ecco il codice hai bisogno. È ispirato alla fonte lsof e allo 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; 
} 

Questo codice di esempio produrrà output come questo:

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

Dove hai trovato OS X come codice sorgente? –

+0

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

Problemi correlati