【问题标题】:Kill all processes from C in Linux在 Linux 中从 C 中杀死所有进程
【发布时间】:2019-01-31 10:41:14
【问题描述】:

我正在编写一个将作为 init 执行的 Linux C 程序。它最终需要关闭系统。我有卸载所有文件系统并实际关闭系统的代码;现在我只需要一种方法将SIGTERM 发送到所有进程sleep(5),然后将SIGKILL 发送到任何剩余进程。

【问题讨论】:

  • 一个将作为 init 执行的 Linux C 程序你要替换init吗?目前还不完全清楚这就是你在做什么。如果您实际上是用自己的代码替换 init,那么它需要做的事情比您迄今为止列出的要多得多。
  • @AndrewHenle 它需要做的比我列出的更多才能关闭系统?具体来说,我正在使用gdb 使已经运行的init exec() 成为我正在编写的可执行文件。
  • 您可能应该在 Torvalds GitHub 上查看初始化过程:linux init filetype:c
  • 如果您正在运行基于systemd 的Linux 发行版,请从这里开始:man7.org/linux/man-pages/man1/init.1.html 和这里:en.wikipedia.org/wiki/Systemd init 在这样的Linux 系统上不是一个简单的过程。跨度>
  • 可以列出目录/proc获取所有进程ID,然后调用kill()向每个进程发送SIGTERM信号。

标签: c linux process signals


【解决方案1】:

如果 pid 为 -1: 如果用户具有超级用户权限,则将信号发送到除系统进程和发送信号的进程之外的所有进程。如果用户不是超级用户 用户,信号被发送给与用户具有相同uid的所有进程,不包括发送信号的进程。如果可以向任何进程发出信号,则不会返回错误。

对 pid 使用 -1 会将信号发送到调用进程有权访问的每个进程,不包括进程 1,例如

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
...
kill(-1, SIGTERM);
sleep(5);
kill(-1, SIGKILL);

谨慎使用。

【讨论】:

  • 非常感谢!我打算编写代码来读取来自/proc 的所有数字条目,然后使用kill() 进行处理,但这要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多