在不使用popen()或system()的情况下按名称查找进程的PID

时间:2008-12-17 15:53:09

标签: c unix signals kill pid

我有一个进程名称,我要向该进程发送kill()信号,但我需要将其PID调用kill()。我只想用:

popen("pidof process_name");

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

另一种方式对于我正在编写的简单代码来说有点过于复杂:执行pidof command's source code实际正在做的事情(它使用函数调用find_pid_by_name()但是它做了很多事情)

如果没有简单的解决办法,我就这样做:

system("pkill <process_name>");

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

7 个答案:

答案 0 :(得分:4)

使用sysctl - Example code

编辑 - 它在Linux see here

中可用

答案 1 :(得分:4)

你提到你使用的是linux。它不是最干净的解决方案,但您可以浏览/ proc中的每个条目,并根据您要查找的内容检查cmdline中的进程名称。

答案 2 :(得分:2)

Procfs读取非常便宜,很多人都认为迭代通过/ proc就像它们会迭代/一样,根本不是这样。

通过跳过1000以下的任何条目来节省一些时间,检查内核线程没有任何意义。所以,基本上......在opendir()之后,如果strtoint()认为该条目是一个int,并且该int大于或等于1000,则只需读取/ proc /%d / stat。

尽量避免解决'exe'链接的冲动,因为这不会告诉你将接收信号的进程的状态。例如,如果目标处于状态“D”(磁盘休眠),您可能想知道,如果D状态是多年生的,信号将不会立即传递,或者可能永远不会传递。

在大多数系统上,需要检查70到120个进程,并且在到达结束之前,您经常会找到目标方式。

答案 3 :(得分:2)

你提到,“我能想到的一种方法是向该进程发送套接字请求并询问其PID。”听起来你要杀的过程就是你写的程序。

如果是这种情况,那么可以做的事情是在程序运行时将pid存储在文件中(通常在/ var / run下,如果你有权访问它),并在程序退出时删除文件。这样,检测程序是否正在运行就像

一样简单
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文件的工作原理。或者你可以要求更详细的解释。

答案 4 :(得分:0)

这似乎对我有用。

您可能希望提供该过程的完整路径,以免您杀死具有相似名称的进程。

这样做的主要优点是您可以指定要发送的信号。

system("killall -s 9 process_name");

答案 5 :(得分:0)

为什么不将fcntl与F_GETOWN一起使用?

答案 6 :(得分:0)