рабочий каталог запущенного процесса на Mac OS - PullRequest
27 голосов
/ 30 ноября 2011

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

Ответы [ 3 ]

37 голосов
/ 30 ноября 2011

lsof -d cwd напечатает текущие рабочие каталоги для всех ваших процессов.Если вы хотите показать информацию о процессах, которые вам не принадлежат, вам нужно запустить его как root (то есть использовать sudo в качестве префикса).Если вы хотите отображать информацию только для определенных программ или процессов, используйте, например, lsof -a -d cwd -c programname или lsof -a -d cwd -p processid (примечание: в обоих случаях флаг -a означает, что ограничения других флагов объединяются и объединяются).lsof довольно сложный и имеет гораздо больше опций, поэтому читайте его справочную страницу для получения дополнительной информации.

6 голосов
/ 22 ноября 2015

Хотя Ответ Гордона Дэвиссона великолепен, если вы хотите сделать это из кода без вызова 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
0 голосов
/ 30 ноября 2011

Если вы говорите об этом в программе Какао, это будет работать:

...