Я был бы готов поспорить, что мои с трудом заработанные деньги из-за этого:
struct proc * process = pfind(arg->pid);
struct thread* td = FIRST_THREAD_IN_PROC(process);
if(process == NULL) {
tda->td_retval[0] = -1;
return -1;
}
В случае, если такого процесса не существует, pfind
вернет NULL согласно manpage :
pfind() and zpfind() return a pointer to a proc structure on success and a NULL on failure.
Функция или макрос FIRST_THREAD_IN_PROC
затем почти наверняка пытается разыменовать process
, чтобы найти первый поток для него.
Поскольку process
имеет значение NULL, разыменование вызовет дамп ядра. Или, вернее, вызовет дамп ядра, если вы просто работаете как обычный процесс, который ядро может просто выбросить.
Тот факт, что это происходит в системном вызове, гораздо более серьезен, поэтому происходит перезагрузка. Вы должны быть далеко более безошибочными в коде уровня ядра, чем код уровня пользователя.
Попробуйте перестроить этот код выше так, чтобы вы проверяли process
на значение NULL до , пытаясь его использовать, что-то вроде:
struct proc * process = pfind(arg->pid);
struct thread* td;
if(process == NULL) {
tda->td_retval[0] = -1;
return -1;
}
td = FIRST_THREAD_IN_PROC(process);