2011-11-30 167 views
24

我想知道Mac OS上进程的工作目录(10.6)。我试图在ps命令的输出中找到PWD环境变量,但PWD变量在那里不可用。有没有更好的方式来找到这个在mac上运行的进程?mac os上运行进程的工作目录

回答

33

lsof -d cwd将打印所有进程的当前工作目录。如果你想显示你没有自己的过程信息,你需要root权限运行它(即使用sudo作为前缀)。如果您想仅显示某些程序或流程的信息,请使用lsof -a -d cwd -c programnamelsof -a -d cwd -p processid(注:在这两种情况下,-a标志意味着其它标志的限制得到‘和’编在一起)。 lsof相当复杂,并有更多的选择,所以阅读其手册页获取更多信息。

+0

正是我一直在寻找,谢谢! – Aarkan

1

如果你在谈论一个Cocoa程序中做这件事,这将工作:

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 lsof源代码? –

+0

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