不使用 popen() 或 system() 按名称查找进程的 PID
题
我有一个进程名称,我必须发送一个 kill()
向该进程发出信号,但我需要它的 PID 来调用 kill()
. 。我只想使用:
popen("pidof process_name");
作为最后一件事。有没有其他方法可以找出进程的PID?我能想到的一种方法是向该进程发送套接字请求并询问其 PID。
对于我正在编写的简单代码来说,另一种方法有点太复杂了:做什么 pidof命令的源代码 实际上正在做(它使用函数调用 find_pid_by_name()
但这做了很多事情)。
如果没有简单的解决方案,我必须这样做:
system("pkill <process_name>");
并检查其返回码。但是 pkill 肯定可以在所有 Linux 机器上使用吗?
解决方案
您提到您正在使用Linux操作系统。它不是最干净的解决方案,但你可以通过在/ proc每个条目并检查CMDLINE进程名反对你在找什么。
其他提示
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?
完成@GregRogers的答案中,你只需要检查执行情况的pidof
- https://gitlab.com/procps-ng/procps/blob/master/pidof.c#L147
- https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.h#L288
- https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L932
正如你可以看到它只搜索/proc目录。