确定进程是否已暂停

3

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


2
通常情况下,上下文是有帮助的。你为什么想知道?你实际上想做什么? - Nemo
只是出于好奇,我想在C程序中做这个。 - jctank
3
我认为您对于 C 语言的限制存在困惑;C 甚至不需要多个进程,而这是您问题的前提条件。因此,这并不是一个关于 C 的问题。如果您研究“如何确定进程是否已暂停在 [插入操作系统信息]?”的话,可能会得到更好的答案。 - autistic
@modifiablelvalue “我该如何在程序中确定一个进程是否已经暂停在 [插入操作系统信息] 中?”否则,这也可以迁移到Superuser。 - Anthony
2个回答

6

/proc/[pid]/stat文件中读取。

根据man手册,可以从这个文件获得进程的状态:

state %c

字符串“RSDZTW”中的一个字符,其中R表示运行,S表示在可中断的等待中睡眠,D表示在不可中断的磁盘睡眠中等待,Z表示僵尸进程,T表示被跟踪或停止(接收到信号),W表示页面换入。


1
@anthony-arnold,用户需要15个声望才能投票支持,因为我认为你的回答很好,所以我将代表他进行投票。 - Barath Ravikumar
1
可惜这在 Mac 上不起作用。但是你可以始终作为子进程运行 ps - vy32
@vy32 没错,这只是其中一种方法。如果不了解提问者的环境,我无法给出完整的答案。 - Anthony
非常感谢。我还需要4个!真是太棒了! - jctank

1

我知道这是一篇旧帖子,但对于像我一样好奇的人来说!

简单的答案是只有一种静态、一致的方法可以检查状态,即从/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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接