macos - 在Mac OS上怎么通过C获取完整的进程名称?
本文介绍了macos - 在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;
}
误导大家了,补充下,是要获取其他进程的名称。
解决方案
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...
这篇关于macos - 在Mac OS上怎么通过C获取完整的进程名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文