5

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

popen("pidof process_name");

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

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

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

system("pkill <process_name>");

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

4

7 回答 7

4

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

于 2008-12-17T16:29:32.793 回答
3

使用 sysctl -示例代码

编辑 - 它在 Linux 中可用,请参见此处

于 2008-12-17T16:04:48.617 回答
2

Procfs 读取非常便宜,许多人认为迭代 /proc 就像迭代 / 一样,实际上根本不是这样。

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

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

在大多数系统上,需要检查 70 到 120 个进程,您通常会在到达终点之前找到目标方式。

于 2009-01-17T15:37:39.110 回答
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 文件如何工作的知识。或者你可以要求更详细的解释。

于 2009-05-21T04:20:29.160 回答
0

这对我来说似乎很好。

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

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

system("killall -s 9 process_name");
于 2008-12-17T16:17:59.387 回答
0

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

于 2009-01-17T14:43:03.430 回答
0

要完成@GregRogers 的答案,您只需要检查 pidof 的实现

如您所见,它仅搜索 /proc 目录。

于 2016-11-05T08:25:58.277 回答