gpt4 book ai didi

C - 如何检查进程是否为系统进程?

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:56 25 4
gpt4 key购买 nike

我正在尝试检测 fork 炸弹,并通过该过程尝试计算每个进程的后代数。但是,我只想计算非系统进程的后代计数,因为 fork 炸弹将是一个非系统进程。但是,我不确定该怎么做。这是我到目前为止所拥有的:

struct task_struct *pTask;
for_each_process(pTask)
{
struct task_struct *p;
*p = *pTask;

//trace back to every ancestor
for(p = current; p != &init_task; p->parent)
{
//increment the descendant count of p's parent
}
}

这个循环正确地上升到 init 任务,因为它是 &init_task?有什么办法可以转到第一个系统进程并停止?因为例如,fork 炸弹将是系统进程的直接子进程。任何帮助将不胜感激,谢谢!!

[编辑]对于系统进程,我的意思是像 bash 这样的东西。我应该解释得更清楚,但在基本层面上,我不想删除任何从启动运行的进程。启动后运行的任何源自用户空间的进程都是公平的游戏,但其他进程则不是。而且我不会检查任何类似 tomcathttpd 的东西,因为我 100% 知道这些进程不会运行。

最佳答案

登录 bash shell 由另一个进程执行(哪个进程取决于它是控制台登录 shell、ssh 登录 shell、gnome-terminal shell 等.) execing bash 进程由 initinit 启动的其他进程执行 ,而不是内核。

用户可以轻松创建自己 fork 的 bash 脚本,因此如果您将 /bin/bash 免除检查,则不会检测到用 bash 编写的 fork 炸弹。例如,将以下脚本放入名为 foo 的文件中并在当前目录中执行,将创建一个 fork 炸弹。

#!/bin/bash
while [ /bin/true ]
do
./foo &
done

看看 bash(1) 中的 ulimitsetrlimit(2)如果您想限制特定用户可以运行的进程数。

或者,您可以为触发终止进程的后代计数设置一个非常高的阈值。如果返回到 init 的父级链有几百深,那么可能发生了一些可疑的事情。

关于C - 如何检查进程是否为系统进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36349126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com