确定进程是否挂起

Determine if a process has suspended

本文关键字:挂起 是否 进程      更新时间:2023-10-16

我尝试向特定进程发送SIGTSTP信号,但是如何确定该进程是否实际上使用C库函数或Linux中的系统调用挂起?

读取/proc/[pid]/stat .

从手册页中,您可以从这个文件中获得进程的状态:

国家% c

字符串"RSDZTW"中的一个字符,其中R正在运行,S正在运行睡眠处于可中断等待状态,D处于不可中断等待状态磁盘睡眠,Z是僵尸,T是跟踪或停止(在一个信号上),W分页。

我知道这是一个旧的帖子,但是对于任何像我一样好奇的人!

简单的答案是只有一种静态的、一致的检查状态的方法,它来自/proc/[pid]/stat,但是如果你想要尽可能少的架构依赖,并且不想这样做,你可以检查信号。

信号只能看到一次,所以你必须自己跟踪它,但waitpid可以点击一个进程,看看是否有任何信号已经收到,因为你上次检查:

    BOOL is_suspended;
    int status;
    pid_t result = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED);
    if(result > 0) { // Signal has been received
        if (WIFSTOPPED(status)) {
            is_suspended = true;
        } else if (WIFCONTINUED(status)) {
            is_suspended = false;
        }
    }