在Linux中杀死所有来自C的进程

3

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


3
您是否正在替换 init?目前还不是很清楚您的意图。如果您确实想用自己的代码替换 init,那么需要进行更多工作,而不仅仅是列出目前的内容。这是一个将作为 init 执行的 Linux C 程序。 - Andrew Henle
@AndrewHenle 为了关闭系统,它需要做比我列出的更多的事情吗?具体来说,我正在使用 gdb 让已经运行的 init exec() 这个我正在编写的可执行文件。 - Billy
2
你可能应该查看Torvalds的GitHub以获取init进程:linux init filetype:c - jww
如果您正在运行基于systemd的Linux发行版,请从这里开始:http://man7.org/linux/man-pages/man1/init.1.html和https://en.wikipedia.org/wiki/Systemd。在这样的Linux系统上,`init`不是一个简单的进程。 - Andrew Henle
1
你可以列出目录 /proc 来获取所有进程的 ID,然后调用 kill() 函数向它们发送 SIGTERM 信号。 - Barmar
显示剩余9条评论
1个回答

7
如果pid为-1: 如果用户拥有超级用户权限,则该信号将发送到除系统进程和发送信号的进程之外的所有进程。如果用户不是超级用户,则该信号将发送到与用户具有相同uid的所有进程,但不包括发送信号的进程。如果任何进程可以被信号化,则不返回错误。
使用-1作为pid将向调用进程具有权限的每个进程发送信号,但不包括进程1,例如。
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
...
kill(-1, SIGTERM);
sleep(5);
kill(-1, SIGKILL);

请谨慎使用。


非常感谢!我原本想写代码从 /proc 读取所有数字条目,然后通过 kill() 处理,但是这个方法更加简单。 - Billy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接