是否有办法检查给定的PID是否与内核空间中的任何进程匹配?
我正在建立一个更改自定义加权循环调度程序权重的系统调用。
我想在调用find_task_by_vpid(pid)
之前进行检查,以避免在PID无效的情况下调用该函数(即,没有具有此PID值的进程)。
这是因为如果使用了无效的PID,我的虚拟机将崩溃。因此,我想进行检查并将错误值-ESRCH
返回到用户空间。
是否有检查功能?
或者是否可以检查find_task_by_vpid(pid) == NULL
以确定PID是否有效?我找不到指定find_task_by_vpid(pid)
无效时返回pid
的文档。
SYSCALL_DEFINE2(set_wrr_weight, pid_t, pid, int, weight){
struct sched_wrr_entity *wrr_se;
// I want to do a check here to see if given pid is valid or not
wrr_se = &find_task_by_vpid(pid)->wrr;
wrr_se->wrr_weight = weight;
return 0;
}
检查find_task_by_vpid()
的返回值应足以确保pid
有效。如果不是,那么就不会有关联的task_struct
。如果需要确认,这正是getsid
syscall处理从用户空间传递的PID的方式:
getsid
但是您的代码中存在另一个问题:据我所知,您没有正确处理// ...
retval = -ESRCH;
p = find_task_by_vpid(pid);
if (!p)
goto out;
// ...
out:
rcu_read_unlock();
return retval;
}
。您应该使用task_struct
而不是find_get_task_by_vpid()
。此函数将为您调用find_get_task_by_vpid()
,增加find_task_by_vpid()
引用计数以避免出现竞争情况(因为从您的代码看来,您的syscall可以休眠)。之后,您可以使用get_task_struct()
减少引用计数。
类似这样的东西:
get_task_struct()
顺便说一句,我不知道您是否正在执行task_struct
,因为您需要在代码中的其他位置使用它,但是如果您不需要,那么您应该可以直接将put_task_struct()
设置为put_task_struct()
]。