在osx内核扩展中通过pid找出进程名称

时间:2014-04-11 12:45:52

标签: macos kernel kernel-extension

我正在研究内核扩展,并希望了解如何通过内核扩展中的pid查找进程名称

此代码在用户空间中非常有用

static char procdata[4096];
int mib[3] = { CTL_KERN, KERN_PROCARGS, pid };
procdata[0] = '\0'; // clear
size_t size = sizeof(procdata);
if (sysctl(mib, 3, procdata, &size, NULL, 0)) {
  return ERROR(ERROR_INTERNAL);
}
procdata[sizeof(procdata)-2] = ':';
procdata[sizeof(procdata)-1] = '\0';
ret = procdata;
return SUCCESS;

但是对于内核空间,存在诸如“使用未声明的标识符'CTL_KERN'”之类的错误(即使我添加#include)

在内核扩展中执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

Kernel.framework标题<sys/proc.h>是您正在寻找的。

特别是,您可以使用proc_name()获取进程的名称,其中包含PID:

/* this routine copies the process's name of the executable to the passed in buffer. It 
 * is always null terminated. The size of the buffer is to be passed in as well. This 
 * routine is to be used typically for debugging 
 */
void proc_name(int pid, char * buf, int size);

但请注意,该名称将被截断为MAXCOMLEN - 16个字节。

您也可以通过内核中的sysctlbyname()使用sysctl。根据我的经验,该函数不能很好地工作,因为sysctl缓冲区内存处理不期望内核地址空间中的缓冲区,因此大多数类型的sysctl如果从非内核调用将导致内核混乱线。它似乎也不适用于所有sysctls。