从pid获取真正的应用路径?

RLT*_*RLT 20 macos bsd macos-carbon process

如何从流程ID获取流程详细信息,如应用程序名称和应用程序的实际路径?

我使用的是Mac OS X.

Ale*_*nov 28

如果您知道PID,那么获取进程名称/位置非常容易,只需使用proc_name或proc_pidpath即可.看看下面的示例,它提供了进程路径:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <libproc.h>

int main (int argc, char* argv[])
{
    pid_t pid; int ret;
    char pathbuf[PROC_PIDPATHINFO_MAXSIZE];

    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));
        } else {
            printf("proc %d: %s\n", pid, pathbuf);
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 关于 proc_pidpath 函数的注意事项:缓冲区大小必须为 PROC_PIDPATHINFO_MAXSIZE。如果指定较小的尺寸,即使尺寸足以适合完整路径,调用也会失败。 (3认同)
  • 这对我很有用,谢谢阿伦!令人惊讶的是,在线查找这些信息有多难 - 所有Linux负责人都坚持认为/ proc应该有效.:-) (2认同)

小智 19

您可以使用活动监视器 - http://en.wikipedia.org/wiki/Activity_Monitor

或者在终端应用程序中,您可以使用:

ps xuwww -p PID
Run Code Online (Sandbox Code Playgroud)

PID是您正在寻找的进程ID有关'ps`命令的更多帮助,您可以找到它

man ps
Run Code Online (Sandbox Code Playgroud)

  • @Qix 我同意!这就是为什么我没有提供它作为答案;) (2认同)

hew*_*ens 8

尝试使用lsof

例:

lsof -p 1066 -Fn | awk 'NR==2{print}' | sed "s/n\//\//"

输出:
/Users/user/Library/Application Support/Sublime Text 2/Packages

  • 不适用于 Mac OS 10.12.1。它是`lsof -p 22558 -Fn | awk 'NR==5{print}' | sed "s/n\//\//"` (3认同)

Mec*_*cki 5

如果 PID 是“用户应用程序”的 PID,那么您可以NSRunningApplication这样获取应用程序的 PID:

NSRunningApplication * app = [NSRunningApplication  
    runningApplicationWithProcessIdentifier:pid
];
Run Code Online (Sandbox Code Playgroud)

并打印可执行文件的路径:

NSLog(@"Executable of app: %@", app.executableURL.path);
Run Code Online (Sandbox Code Playgroud)

应用程序包本身就在这里

NSLog(@"Executable of app: %@", app.bundleURL.path);
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于系统或后台进程,它仅限于用户应用程序(通常在启动后在扩展坞中可见的应用程序)。该NSRunningApplication对象允许检查应用程序是否是主动的,隐藏/取消隐藏它以及执行所有其他类型的简洁操作。

只是想我在这里提到它是为了完整性。如果您想使用任意进程,那么接受的答案当然更好。