Узнать имя процесса по 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 будут вызывать панику ядра, если вызывается из неядерного потока. Это также не работает для всех систем.

Другие вопросы по тегам