我想杀死与killall
命令类似的其他应用程序,因为我知道应用程序但无法PID
在运行时获取。
这必须用 C 代码完成。我知道,kill()
但是需要PID
。还有其他相当于killall的方法吗?
答案1
kill(2)
是向进程发送信号的系统调用,没有与该实用程序等效killall
的工具。
在 C 中执行此操作的一个简单方法是killall
使用 system(3) 库函数或可能的 popen(3) 从 C 程序中调用。
或者,您可以阅读有关伪文件系统的手册页/proc
并搜索命令名称并自行查找 pid。
man 2 kill
man 3 system
man 3 popen
man 5 proc
答案2
要回答标题中的问题,不存在可以执行此匹配的 C 库。甚至 libprocps 也没有这样做。
Killall 是一个简单的程序:
- 找出你想要匹配的内容
- 有效地在 /proc 上查找名称中仅包含数字的目录并与这些目录下的文件进行匹配
由于它是通用的(例如,它不知道用户事先将使用什么匹配标准),因此它有很多匹配项。你应该已经知道你想要匹配什么了。您的问题并没有真正说明,但听起来像是名称或命令行。
我真的很警告整个方法。进程应该真正确定它们正在接触哪些其他进程。名字是一个糟糕的匹配,因为我可以轻易地伪造它。还要考虑您可能有两个用户或两个系统使用相同的名称,应该终止哪个进程?
PID 文件或其他在程序启动时记录 PID 的方法要好得多,因为您确切地知道您正在谈论哪个进程(除非它们分叉)
正如 Richard 上面指出的,killall 代码是 GPL2+,因此您可以使用相同的许可证重复使用它。该项目已转移到 gitlab,目前位于https://gitlab.com/psmisc/psmisc