2008-12-17 27 views
5

我有一个进程名称,我必须向该进程发送一个kill()信号,但我需要其PID来调用kill()。我只想使用:在不使用popen()或system()的情况下通过名称查找进程的PID

popen("pidof process_name"); 

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

另一种方式是一个简单的代码,我写了一点太复杂:做什么pidof command's source code其实就是做(它使用一个函数调用find_pid_by_name()但在做很多事情)。

如果没有简单的解决方案是可能的,我已经做到这一点:

system("pkill <process_name>"); 

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

回答

4

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

+0

应该是非常直接的使用boost :: regex和boost :: filesystem我认为 – 2008-12-17 16:33:38

+0

我曾经看过pidof的strace输出,并认为它是以同样的方式。 (可能在两者之间有所变化) – 2008-12-17 16:35:09

4

使用sysctl - Example code

编辑 - 它是在Linux的see here

+0

非常感谢!我会研究这个。 – Srikanth 2008-12-17 16:14:39

+1

这只适用于* BSD,不适用于Linux。 – ephemient 2008-12-17 22:37:08

0

可这似乎为我工作的罚款。

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

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

system("killall -s 9 process_name"); 
+0

这与pkill版本没有什么不同...... – 2008-12-17 16:23:54

0

为什么不使用fcntl和F_GETOWN?

2

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

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

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

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

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文件是如何工作的仔细研究。或者你可以问一个更详细的解释。

相关问题