Я хочу знать рабочий каталог процесса в Mac OS (10.6). Я попытался найти переменную среды PWD в команде команды ps, но переменная PWD там недоступна. Есть ли лучший способ найти это для запуска процесса на Mac?
Рабочий каталог запущенного процесса на mac os
Ответ 1
lsof -d cwd
будет печатать текущие рабочие каталоги для всех ваших процессов. Если вы хотите показать информацию о процессах, которые у вас нет, вам нужно запустить ее как root (например, использовать sudo
в качестве префикса). Если вы хотите показывать информацию только для определенных программ или процессов, используйте, например, lsof -a -d cwd -c programname
или lsof -a -d cwd -p processid
(обратите внимание: в обоих случаях флаг -a
означает, что ограничения других флагов получаются и объединены вместе). lsof
довольно сложный и имеет больше возможностей, поэтому прочитайте его справочную страницу для получения дополнительной информации.
Ответ 2
Хотя ответ Гордона Дэвисона, это здорово, если вы хотите сделать это из кода, не вызывая lsof
, вот код, который вам нужен. Это вдохновило источник lsof и это сообщение в блоге.
#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;
}
Этот пример кода будет выводить вывод следующим образом:
proc 44586 executable: /bin/zsh
proc 44586 cwd: /private/tmp
Ответ 3
Если вы говорите об этом в программе Cocoa, это будет работать:
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSString *currentPath = [fm currentDirectoryPath];