有没有一种方法可以检查给定的pid是否与内核空间中的任何进程匹配?

问题描述 投票:0回答:1

是否有办法检查给定的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;
}
c kernel system-calls pid
1个回答
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() ]。

© www.soinside.com 2019 - 2024. All rights reserved.