内核模块实现用户态调度器调用kill_pid报隐式声明错误如何解决
报错原因
- 缺失
kill_pid函数声明对应的头文件,你当前引入的<linux/sched.h>和<linux/pid.h>未包含该函数定义,因此触发隐式声明报错。 - 你对
kill_pid的调用不符合内核API要求:该函数第一个入参要求是struct pid *类型的PID结构体指针,你传入的是pid_t类型的数值PID;同时该函数要求传入3个参数,你仅传入了2个。
修复步骤
- 新增头文件引入
#include <linux/signal.h>
- 修正
kill_pid调用逻辑
你需要先将pid_t类型的数值PID转换为内核struct pid结构体指针,再调用kill_pid发送信号,使用完后释放PID结构体的引用,修改后的代码片段如下:
list_for_each_entry_safe(cursor, temp, ¤t_UMS->scheduler_thread, next) { struct pid *pid_struct = find_get_pid(cursor->pid); if (pid_struct) { // 第三个参数1表示内核态特权发送信号,跳过权限校验 kill_pid(pid_struct, SIGTERM, 1); put_pid(pid_struct); } list_del(&cursor->next); kfree(cursor); }
额外注意事项
如果你的内核版本高于5.14,kill_pidAPI已被移除,可以替换为更通用的send_sig实现相同逻辑:
struct task_struct *task = pid_task(find_get_pid(cursor->pid), PIDTYPE_PID); if (task) { send_sig(SIGTERM, task, 1); }
内容的提问来源于stack exchange,提问作者francesco douglas
相关产品推荐
相关产品推荐

