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

时间:2011-09-22 08:30:52

标签: macos process macos-carbon bsd

如何获取应用程序名称和流程等详细信息?来自进程ID的真实应用程序?

我使用的是Mac OS X.

6 个答案:

答案 0 :(得分:26)

如果您知道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;
}

答案 1 :(得分:18)

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

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

ps xuwww -p PID

PID是您要查找的进程ID 有关'ps`命令的更多帮助,您可以使用

找到
man ps

答案 2 :(得分:7)

尝试使用lsof

示例:

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

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

答案 3 :(得分:2)

如果PID是&#34;用户应用程序&#34;的PID,那么您可以获得该应用的NSRunningApplication

NSRunningApplication * app = [NSRunningApplication  
    runningApplicationWithProcessIdentifier:pid
];

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

NSLog(@"Executable of app: %@", app.executableURL.path);

应用包本身就在这里

NSLog(@"Executable of app: %@", app.bundleURL.path);

然而,这不适用于系统或后台流程,它仅限于用户应用程序(通常在发布后在Dock中可见)。 NSRunningApplication对象允许检查应用程序是否具有优势,隐藏/取消隐藏它并执行所有其他类型的整洁。

我想我在这里提到完整性。如果你想使用任意进程,那么接受的答案当然会更好。

答案 4 :(得分:0)

我想在bash中制作更好的ssh-copy-id !! 为此,我必须知道sshd在哪里向他询问他的实际配置。 在某些系统上,我有多个sshd,这不是我的朋友。 另外在某些macOS上,ps命令没有显示sshd的完整路径。

lsof -p $PPID | grep /sshd | awk '{print $9}'

此回归

/usr/sbin/sshd

之后我可以要求

sudo /usr/sbin/sshd -T | grep authorizedkeysfile

这个回归,在一些系统上

authorizedkeysfile .ssh/authorized_keys

所以我必须输入.ssh / authorized_keys

答案 5 :(得分:-1)

使用this code查找processinfo psn。

然后使用以下函数获取位置

OSStatus GetProcessBundleLocation (const ProcessSerialNumber *psn, FSRef *location);