macos - programa - Directorio de trabajo del proceso en ejecución en Mac OS
explorador de archivos mac (3)
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 una mejor manera de encontrar esto para un proceso en ejecución en mac?
Aunque la respuesta de Gordon Davisson es excelente, si desea hacerlo desde un código sin llamar a lsof
, aquí está el código que necesita. Está inspirado en la fuente de lsof y esta publicación de blog .
#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 esta:
proc 44586 executable: /bin/zsh
proc 44586 cwd: /private/tmp
Si estás hablando de hacerlo dentro de un programa Cocoa, esto funcionará:
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSString *currentPath = [fm currentDirectoryPath];
lsof -d cwd
imprimirá los directorios de trabajo actuales para todos sus procesos. Si desea mostrar información sobre procesos que no posee, debe ejecutarla como root (es decir, usar sudo
como prefijo). Si desea mostrar la información solo para ciertos programas o procesos, utilice, por ejemplo, lsof -a -d cwd -c programname
o lsof -a -d cwd -p processid
(nota: en ambos casos, el indicador -a
significa que la otra las restricciones de las banderas se "y" se editan 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.