从PID获取名称?

时间:2012-09-05 01:57:20

标签: objective-c c macos unix process

我在OSX Mountain Lion上,正在尝试使用其PID检索进程名称。

以下是我正在使用的代码:

pid_t pid = 10687;
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = "";
char nameBuffer [256] = "";

int sizeOfVal = sizeof(nameBuffer);
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer));
proc_name(pid, nameBuffer, sizeof(nameBuffer));

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer);

上面的代码能够正确检索名称,但它只检索前15个字符并“忽略”其余字符。请注意,这不是显示名称的问题,而是检索它。问题不在我的应用程序的其余部分,因为我在独立应用程序中测试上面的代码。另请注意,我尝试更改PID,但无论我尝试什么PID,代码只检索名称的前15个字符。路径检索工作得很好。

有没有人对我做错了什么有任何想法?

1 个答案:

答案 0 :(得分:9)

该函数查看的值是struct proc_bsdshortinfo。它包含返回16字节字符串,或包含空终止符时的15个可读字符。

来自sys/param.h

#define MAXCOMLEN   16      /* max command name remembered */

来自sys/proc_info.h

struct proc_bsdshortinfo {
        uint32_t                pbsi_pid;       /* process id */
        uint32_t                pbsi_ppid;      /* process parent id */
        uint32_t                pbsi_pgid;      /* process perp id */
    uint32_t                pbsi_status;        /* p_stat value, SZOMB, SRUN, etc */
    char                    pbsi_comm[MAXCOMLEN];   /* upto 16 characters of process name */
    uint32_t                pbsi_flags;              /* 64bit; emulated etc */
        uid_t                   pbsi_uid;       /* current uid on process */
        gid_t                   pbsi_gid;       /* current gid on process */
        uid_t                   pbsi_ruid;      /* current ruid on process */
        gid_t                   pbsi_rgid;      /* current tgid on process */
        uid_t                   pbsi_svuid;     /* current svuid on process */
        gid_t                   pbsi_svgid;     /* current svgid on process */
        uint32_t                pbsi_rfu;       /* reserved for future use*/
};

编辑:要解决这个问题,请获取最后一个路径组件:

pid_t pid = 3051;
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE];
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer));

char nameBuffer[256];

int position = strlen(pathBuffer);
while(position >= 0 && pathBuffer[position] != '/')
{
    position--;
}

strcpy(nameBuffer, pathBuffer + position + 1);

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer);