代码之家  ›  专栏  ›  技术社区  ›  Srikanth

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

  •  5
  • Srikanth  · 技术社区  · 16 年前

    我有一个进程名,我要发送一个 kill() 信号到那个进程,但我需要它的PID来调用 KILL() . 我只想使用:

    popen("pidof process_name");
    

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

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

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

    system("pkill <process_name>");
    

    并检查其返回代码。但是pkill在所有的Linux机器上都可以确定吗?

    7 回复  |  直到 8 年前
        1
  •  4
  •   Greg Rogers    16 年前

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

        2
  •  4
  •   Martin Beckett    16 年前

    使用SysTLL Example code

    编辑-它在Linux中可用 see here

        3
  •  2
  •   Tim Post Samir J M Araujo    16 年前

    procfs的读取非常便宜,很多人认为通过/proc进行迭代就像通过/proc进行迭代一样,实际上根本不是这样。

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

    尝试避免仅仅解析“exe”链接的冲动,因为这不会告诉您将接收信号的进程的状态。例如,如果目标处于“d”(磁盘休眠)状态,您将希望知道,因为如果d状态是永久性的,则信号不会立即传递,或者可能永远不会传递。

    在大多数系统中,有70到120个过程需要检查,并且您通常会在到达终点之前找到目标的方法。

        4
  •  2
  •   cjs    16 年前

    你提到,“我能想到的一种方法是向那个进程发送一个套接字请求,并请求它的PID。”听起来你试图杀死的进程是你编写的一个程序。

    如果是这样的话,canonical要做的就是在程序运行时将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文件如何工作的知识。或者你可以要求更详细的解释。

        5
  •  0
  •   partoa    16 年前

    这对我来说似乎很管用。

    不过,您可能希望给出进程的完整路径,以免杀死具有类似名称的进程。

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

    system("killall -s 9 process_name");
    
        6
  •  0
  •   eSKon    16 年前

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