Подтвердить что ты не робот

Рабочий каталог запущенного процесса на mac os

Я хочу знать рабочий каталог процесса в Mac OS (10.6). Я попытался найти переменную среды PWD в команде команды ps, но переменная PWD там недоступна. Есть ли лучший способ найти это для запуска процесса на Mac?

4b9b3361

Ответ 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];