linux - 如何更改Linux中特定应用程序的进程ID

标签 linux process linux-kernel linux-device-driver kernel-module

我知道这可以在用户空间中完成,并且已经回答了 before .

但是,我希望能够通过内核函数/模块来完成此操作。

更新 c 代码(从其他回答的问题中引用)是 criu 项目的一部分。并且文件 /proc/sys/kernel/ns_last_pid 并非在所有系统中都存在。所以,该代码在 ubuntu 上不起作用。有什么办法可以让它在 ubuntu 上运行吗?

我的最终目标是: fork 一个进程并为其提供父进程的 ID。

步骤:以进程名称 P 和 id x 开始。

  1. 从 P 内部派生一个进程。将子进程命名为 Q。
  2. 为父进程 P 分配一个临时 ID,例如 a。
  3. 修改子进程Q的id,设置为x。
  4. 另一个内核函数将重新连接子进程 Q 的父进程。以便 P 的父进程成为 Q 的父进程。换句话说,子进程将采用其父进程的身份。
  5. 进程 P 由于没有等待任何进程而终止。

我知道如何执行步骤 4-5。我已经实现了。我正在破解另一个 Linux 内核项目。所以,我没有其他办法解决这个问题。我必须以这种方式实现。

谢谢大家。

最佳答案

内核假定一个进程是通过它的pid来标识的;如果不更改整个内核的大量代码,更改已运行进程的 pid 不太可能起作用。

要为进程 Q 提供与进程 P 相同的 pid,请使用第三个进程 R,该进程 R 在 P 终止之后、Q 启动之前设置 ns_last_pid 。 (有关如何使用ns_last_pid,请参阅this example。)

关于linux - 如何更改Linux中特定应用程序的进程ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027455/

相关文章:

git - linux-next 和 linux-net-history git 存储库有什么区别?

linux - 在双十进制 shell 脚本中打印时间

python - 如何拦截对特定页面的所有请求(以Python为例)

linux - FUSE:链接基于 FUSE 的文件系统时如何获取调用进程的原始(非 root)用户

c# - .net current Process.MainModule 的 C++ 等价物是什么?

java - 如何在 Unix/Linux 中使用 java 获取正在运行的进程详细信息

c - Linux内核模块中的Write函数被重复调用

c - 子僵尸进程的 setpgid 提供 ESRCH 而不是 EACCES?

javascript - Node.js 无法获得衍生进程的输出

c - 使用 sched_setscheduler