5

今天在使用Linux 内核命名空间时遇到了一些困难,特别是将唯一 PID 命名空间内的 PID 与全局 PID 命名空间内的那些相关联

我需要能够执行以下操作之一:

a)使用命名空间分配的 PID 从全局范围中杀死一个进程

或者

b)将命名空间特定的 PID 转换为全局 PID,这样我就可以从全局范围内终止 PID

或者

c)启用 PID 命名空间内的进程向我报告其全局 PID,这样我就可以从全局范围内终止 PID

这里有一些关于在命名空间场景中包含 PID 信息的进程结构的讨论。我不确定如何/是否可以从用户应用程序访问这些结构,或者我是否需要通过内核 hack 添加支持。

为什么? 我有一个当前使用网络命名空间的应用程序。我正在添加对 PID 命名空间的支持。以下是它目前的工作方式:

在引入 PID 命名空间之前: 主应用程序当前在另一个网络命名空间中启动了一个 bash 控制台。然后它使用该 bash 控制台启动程序并让这些程序报告它们当前的 PID。当主应用程序想要终止该网络命名空间中的子进程时,它只是告诉操作系统终止报告的 PID。

使用 PID 命名空间(损坏状态): 主应用程序当前在另一个网络和 PID 命名空间中启动 bash 控制台。然后它使用该 bash 控制台启动程序并让这些程序报告它们当前的 PID。但是,返回的当前 PID 在全局 PID 命名空间中无效(可能是 10,当全局命名空间中的 PID 为 56000 时)。结果,主应用程序无法杀死该网络 + PID 命名空间中的子进程

一如既往,感谢任何指导

4

1 回答 1

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;
}

希望能帮助到你!

此致!

于 2013-12-07T06:12:25.717 回答