gpt4 book ai didi

c - 如何在 Linux 上同步终止进程?

转载 作者:IT王子 更新时间:2023-10-29 01:13:36 26 4
gpt4 key购买 nike

当我在进程上调用 kill() 时,它会立即返回,因为它只是发送一个信号。我有一个代码,我正在无限循环中检查一些(外国的,不是我写的,也不是我可以修改的)进程,如果它们超过某些限制(吃掉太多的 ram 等),它会杀死它们(并写入系统日志等)。

问题是,当进程被大量交换时,杀死它们需要很多秒,因此,我的进程多次对相同的进程执行相同的检查,并尝试多次向同一进程发送信号,然后写入这也是系统日志。 (这不是故意的,这只是我试图修复的副作用)

我不关心它发送了多少次信号进行处理,但我关心它写入系统日志的次数。我可以保留一份已发送终止信号的 PID 列表,但理论上,即使概率很低,也可能会产生另一个进程 具有与之前被杀死的进程相同的 pid,这可能也应该被杀死,在这种情况下,日志将丢失。

我不知道是否有任何进程的唯一标识符,但我对此表示怀疑。我如何同步终止进程,或跟踪收到信号且不需要再次记录的进程?

最佳答案

即使您可以执行“同步终止”,您仍然会遇到可能终止错误进程的竞争条件。每当您想要终止的进程自行退出或通过第三方操作退出时,它就会在您看到它之后但在您终止它之前发生。在此间隔期间,可以将 PID 分配给新进程。这个问题基本上没有解决办法。 PID 本质上是一种本地资源,属于已识别进程的父进程;任何其他进程使用 PID 都是竞争条件。

如果您对系统有更多的控制权(例如,控制您要终止的进程的父进程),那么可能会有特殊情况的解决方案。可能还有(特定于 Linux 的)解决方案基于在 /proc 中使用某些机制来避免竞争,尽管我不知道有任何解决方案。

另一种解决方法可能是在目标进程上使用 ptrace,就好像您要调试它一样。这允许您部分“窃取”父角色,避免在您仍在使用 PID 时使其失效,并允许您在进程终止时收到通知。你会做类似的事情:

  1. 检查进程信息(例如来自 /proc)以确定您要终止它。
  2. ptrace 它,暂时停止它。
  3. 重新检查进程信息以确保您获得了想要终止的进程。
  4. 恢复跟踪过程。
  5. 杀死它。
  6. 等待(通过 waitpid)进程退出的通知。

关于c - 如何在 Linux 上同步终止进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20132671/

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