Узнать имя процесса по pid в расширении ядра osx
Я работаю над расширением ядра и хочу узнать, как найти имя процесса по 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 ответ
Заголовок 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 байт.
Вы также можете использовать sysctl через sysctlbyname()
из ядра. По моему опыту, эта функция не работает должным образом, так как обработка буферной памяти sysctl не ожидает буферов в адресном пространстве ядра, поэтому большинство типов sysctl будут вызывать панику ядра, если вызывается из неядерного потока. Это также не работает для всех систем.