在Mac OS上怎么通过C获取完整的进程名称?

我现在是通过 kinfo_proc.kp_proc.p_comm 字段拿到的名称,可是 p_comm 长度有限制,只能显示16个字符,名称字符多的就被截断了,如 Google Chrome Helper ,我这里输出就会变为 Google Chrome He;而通过 proc_pidpath 拿到的是可执行文件的完整路径。

请问各位有没有能拿到完整名称的方法?

完整代码如下:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/sysctl.h>
#include <sys/types.h>

#define NAME_LEN 4

int main(int argc, char **argv)
{
    struct kinfo_proc *process = NULL;
    size_t proc_buf_size;
    int st, proc_count;
    int name[NAME_LEN] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
    pid_t pid;

    st = sysctl(name, NAME_LEN, NULL, &proc_buf_size, NULL, 0);
    process = malloc(proc_buf_size);
    st = sysctl(name, NAME_LEN, process, &proc_buf_size, NULL, 0);

    proc_count = proc_buf_size / sizeof(struct kinfo_proc);
    while (st < proc_count) {
        pid = process[st].kp_proc.p_pid;
        printf("pid: %d  name: %s\n", pid, process[st].kp_proc.p_comm);
        st++;
    }
    
    return 0;
}

误导大家了,补充下,是要获取其他进程的名称。

阅读 7.5k
1 个回答

kp_proc里面是拿不到完整的,只有16位

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*/
};

可以试试这个:

#import <sys/proc_info.h>
#import <libproc.h>

int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);
pid_t pids[numberOfProcesses];
bzero(pids, sizeof(pids));
proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));
for (int i = 0; i < numberOfProcesses; ++i) {
    if (pids[i] == 0) { continue; }
    char pathBuffer[PROC_PIDPATHINFO_MAXSIZE];
    bzero(pathBuffer, PROC_PIDPATHINFO_MAXSIZE);
    proc_pidpath(pids[i], pathBuffer, sizeof(pathBuffer));
    if (strlen(pathBuffer) > 0) {
        printf("path: %s\n", pathBuffer);
    }
}

我只是个搬运工
http://stackoverflow.com/ques...
http://stackoverflow.com/ques...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏