web-dev-qa-db-ja.com

MacOSで実行中のプロセスの作業ディレクトリ

Mac OS(10.6)のプロセスの作業ディレクトリを知りたい。 psコマンドの出力でPWD環境変数を見つけようとしましたが、PWD変数が利用できません。 Macで実行中のプロセスに対してこれを見つけるためのより良い方法はありますか?

29
Aarkan

lsof -d cwdは、すべてのプロセスの現在の作業ディレクトリを出力します。所有していないプロセスに関する情報を表示する場合は、rootとして実行する必要があります(つまり、プレフィックスとしてSudoを使用します)。特定のプログラムまたはプロセスのみの情報を表示する場合は、たとえば、 lsof -a -d cwd -c programnameまたはlsof -a -d cwd -p processid(注:どちらの場合も、-aフラグは、他のフラグの制限が「および」一緒になることを意味します)。 lsofはかなり複雑で、オプションがたくさんあるので、詳細についてはmanページを読んでください。

38
Gordon Davisson

Gordon Davissonの答え は素晴らしいですが、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
6
Charphacy

Cocoaプログラム内でそれを行うことについて話している場合、これは機能します。

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