我正在研究内核扩展,并希望了解如何通过内核扩展中的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)
在内核扩展中执行此操作的正确方法是什么?
答案 0 :(得分:3)
Kernel.framework标题<sys/proc.h>
是您正在寻找的。 p>
特别是,您可以使用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。