今天在Linux kernel namespaces遇到一些困难,特别是将unique PID namespace内的PID与全局PID命名空间内的PID相关联
我需要能够执行以下操作之一:
a)使用命名空间指定的PID从全局范围终止进程
或
b)将特定于命名空间的PID转换为全局PID,因此我可以从全局范围中删除PID
或
c)启用PID命名空间内的进程向我报告其全局PID,因此我可以从全局范围中删除PID
对名称空间方案here中包含PID信息的流程结构进行了一些讨论。我不确定如何/如果我可以从用户态应用程序访问这些结构,或者我是否需要通过内核hack添加支持。
为什么吗 我有一个当前使用网络命名空间的应用程序。我正在添加对PID命名空间的支持。以下是它目前的工作原理:
在引入PID名称空间之前: 主应用程序当前在另一个网络命名空间中启动bash控制台。然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID。当主应用程序想要杀死该网络命名空间中的子进程时,它只是告诉操作系统杀死报告的PID。
使用PID命名空间(损坏状态): 主应用程序当前在另一个网络和PID命名空间中启动bash控制台。然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID。但是,报告的当前PID在全局PID命名空间中无效(当全局命名空间中的PID为56000时,它可能为10)。因此,主应用程序无法终止该网络+ PID命名空间中的子进程
与往常一样,任何指导都表示赞赏
答案 0 :(得分:0)
一种方法可以在pid队列中搜索与目标pid匹配的进程描述符,如果报告shell在同一个工作区,它可以进行系统调用以获取其他进程的“进程描述符”并进行某种处理for循环查找/ proc /<中的进程描述符PID>
您可能还想看看这里:http://lkml.indiana.edu/hypermail/linux/kernel/0707.0/1701.html 特别是这部分:
/*
* the helpers to get the pid's id seen from different namespaces
*
* pid_nr() : global id, i.e. the id seen from the init namespace;
* pid_vnr() : virtual id, i.e. the id seen from the namespace this pid
* belongs to. this only makes sence when called in the
* context of the task that belongs to the same namespace;
* pid_nr_ns() : id seen from the ns specified.
*
* see also task_xid_nr() etc in include/linux/sched.h
*/
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
- nr = pid->nr;
+ nr = pid->numbers[0].nr;
return nr;
}
希望它有所帮助!
最诚挚的问候!