2011-11-30 9 views
24

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

答えて

33

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

+0

私は感謝、探していたまさに! – Aarkan

1

あなたはココアプログラム内でそれをやって話をしている場合、これは動作します:

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

Gordon Davisson's answerは素晴らしいですが、あなたがlsofに出て呼び出すことなく、コードからそれを実行したい場合は、ここでのコードですあなたが必要です。それはlsofソースとthis blog postに触発されています。

#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

OS Xのソースコードはどこで見つかりましたか? –

+0

https://opensource.apple.com/source/lsof/ – Charphacy

関連する問題