我有一个进程名称,我要向该进程发送kill()
信号,但我需要将其PID调用kill()
。我只想用:
popen("pidof process_name");
作为最后一件事。有没有其他方法可以找到进程'PID?我能想到的一种方法是向该进程发送套接字请求并询问其PID。
另一种方式对于我正在编写的简单代码来说有点过于复杂:执行pidof command's source code实际正在做的事情(它使用函数调用find_pid_by_name()
但是它做了很多事情)
如果没有简单的解决办法,我就这样做:
system("pkill <process_name>");
并检查其返回码。但是,在所有Linux机器上都可以使用pkill吗?
答案 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)
要完成@GregRogers答案,您只需要检查pidof的实现
你可以看到它只搜索/ proc目录。