我有一个进程名称,我必须发送一个 kill() 向该进程发出信号,但我需要它的 PID 来调用 kill(). 。我只想使用:

popen("pidof process_name");

作为最后一件事。有没有其他方法可以找出进程的PID?我能想到的一种方法是向该进程发送套接字请求并询问其 PID。

对于我正在编写的简单代码来说,另一种方法有点太复杂了:做什么 pidof命令的源代码 实际上正在做(它使用函数调用 find_pid_by_name() 但这做了很多事情)。

如果没有简单的解决方案,我必须这样做:

system("pkill <process_name>");

并检查其返回码。但是 pkill 肯定可以在所有 Linux 机器上使用吗?

有帮助吗?

解决方案

您提到您正在使用Linux操作系统。它不是最干净的解决方案,但你可以通过在/ proc每个条目并检查CMDLINE进程名反对你在找什么。

其他提示

使用 sysctl - 示例代码

编辑 - 它在 Linux 中可用 看这里

PROCFS读取都非常便宜,很多人想通过的/ proc迭代像他们将通过/迭代,其实际情况并非如此,在所有的。

跳过那就是1000下的任何条目保存一段时间,有一个在检查内核线程没有意义的。所以,基本上..执行opendir()之后,如果strtoint()认为入口是一个int,而int是大于或等于1000,刚读的/ proc /%d / STAT。

尽量避免冲动,只是解决“EXE”链接,这是不会告诉你,将收到的信号处理的状态。举例来说,如果目标处于状态“d”(硬盘休眠),你会想知道的信号将无法立即送达,或也许永远,如果d状态是常年。

在大多数系统中,将是70 - 120流程来检查,你会经常在到达结束前找到你的目标的方式。

您提到,“我能想到的一种方式是发送一个插座要求这一进程,并要求其PID。”这听起来像你试图杀死进程是你写的程序。

如果是这样的情况下,cannonical要做的是到PID存储在一个文件(通常在/ var /运行,如果你有机会获得它),而程序运行,并删除文件时,程序退出。这样一来,检测该程序是否正在运行很简单,只要

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

以上代码的所有影响可能会教你很多关于PID文件是如何工作的仔细研究。或者,你可以要求一个更详细的解释。

这似乎为我工作的罚款。

您可能想给进程的完整路径,虽然,免得你杀了那个有着相似名称的进程。

这样做的主要好处是,你可以指定你要发送的信号。

system("killall -s 9 process_name");

为什么不与F_GETOWN使用的fcntl?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top