如何使用C?
检测Linux中的挂起进程答案 0 :(得分:4)
在linux下,这样做的方法是检查/ proc / [PID] / *的内容,一个好的一站式位置是/ proc / * / status。它的前两行是:
姓名:[节目名称] 州:R(正在运行)
当然,检测挂起的进程是一个完全独立的问题。
/ proc / / stat是一种与/ proc / / status相同信息的机器可读格式,实际上是ps(1)命令读取生成它的信息输出
答案 1 :(得分:2)
看到问题已经改变:
http://procps.sourceforge.net/
是ps和其他处理工具的来源。他们确实使用proc(表明它可能是读取过程信息的传统和最佳方式)。它们的来源非常易读。文件
/procps-3.2.8/proc/readproc.c
您还可以将您的程序链接到 libproc ,这可以在您的仓库中提供(或者我已经安装了),但是您需要“-dev”变体以用于标题和以下内容 - 不。使用此API,您可以阅读流程信息和状态。
您可以通过libproc使用psState()函数来检查
之类的内容#define PS_RUN 1 /* process is running */
#define PS_STOP 2 /* process is stopped */
#define PS_LOST 3 /* process is lost to control (EAGAIN) */
#define PS_UNDEAD 4 /* process is terminated (zombie) */
#define PS_DEAD 5 /* process is terminated (core file) */
#define PS_IDLE 6 /* process has not been run */
回复评论 IIRC,除非你的程序在CPU上并且你可以在内核中使用信号刺激它......你无法确定它的反应性如何。即使这样,在陷阱之后调用一个信号处理程序,它可以在该状态下正常运行。
最好的办法是在另一个核心上安排另一个进程,该进程可以在运行时(或循环或无响应)以某种方式戳过程序。但我在这里可能是错的,这将是棘手的。
祝你好运
答案 2 :(得分:1)
监控和/或终止进程只是系统调用的问题。我认为你问题中最棘手的部分确实可靠地确定一个过程是“挂起”的,而不是非常繁忙(或等待临时条件)。
在一般情况下,我认为这会相当困难。即使Windows在用户认为程序可能“挂起”时也要求用户做出决定(在我的系统上,这通常也是错误的)。
但是,如果您有一个特定程序喜欢以特定方式挂起,我认为您应该能够可靠地检测到它。
答案 3 :(得分:1)
您可以使用strace()使用的任何机制来确定进程正在进行的系统调用。然后,您可以确定最终用于pthread_mutex死锁或其他任何内容的系统调用...然后您可以使用启发式方法并确定如果进程挂起锁定系统调用超过30秒,它陷入僵局。
答案 4 :(得分:1)
您可以在进程pid上运行'strace -p',以确定它正在进行的系统调用(如果有)。如果一个进程没有进行任何系统调用但是正在使用CPU时间,那么它将挂起,或者在用户空间内的紧密计算循环中运行。您确实需要知道单个程序的预期行为才能确定。如果它没有进行系统调用但没有使用CPU,它也可能只是空闲或死锁。
唯一的防弹方法是修改被监控的程序,以便经常向'看门狗'进程发送'ping',或者在请求时响应ping请求,例如套接字连接在哪里你可以问它“你活着吗?”并回来“是”。程序可以编码,如果它已经进入某个地方的杂草并且没有正确执行,则不太可能执行ping操作。我很确定这就是Windows知道进程挂起的方式,因为每个Windows程序都有某种事件队列,它从操作系统处理一组已知的API。
不一定是一种编程方式,但是判断程序是否“挂起”的一种方法是使用gdb进入它并拉回溯并查看它是否卡在某处。