5

给定一个进程的 pid,我如何确定该进程是暂停(使用 SIGSTOP)还是正在运行?

我使用的是 OS X,所以我没有/proc目录。

4

3 回答 3

2

这就是你的做法:

#include <stdio.h>
#include <sys/sysctl.h>
#include <stdlib.h>
#include <string.h>

#define IS_RUNNING(proc) ((proc->kp_proc.p_stat & SRUN) != 0)

#define ERROR_CHECK(fun) \
    do { \
        if(fun) { \
            goto ERROR; \
        }\
    } while(0)

struct kinfo_proc *proc_info_for_pid(pid_t pid) {
    struct kinfo_proc *list = NULL;

    int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
    size_t size = 0;

    ERROR_CHECK(sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &size, NULL, 0));

    list = malloc(size);
    ERROR_CHECK(sysctl(mib, sizeof(mib) / sizeof(*mib), list, &size, NULL, 0));

    return list;

ERROR:
    if(list) {
        free(list);
    }
    return NULL;
}

int main() {
    pid_t pid = 1000;
    struct kinfo_proc *proc_info = proc_info_for_pid(pid);
    if(proc_info) {
        printf("Is running: %d\n", IS_RUNNING(proc_info));
    } else {
        printf("Could not stat process!");
        return 1;
    }
    return 0;
}
于 2013-06-09T04:32:35.620 回答
2

这不是一个很好的答案,但它是一个答案..您可以运行 ps aux (从您的程序中)并查看 STAT 列是否为 T (停止)。刚刚在山狮身上查过。

不知道它是如何计算出来的。

我想我越来越接近 kvm_* 功能:

使用 C 在 OS X 中获取其他进程的 argv

kvm_getargv()

http://www.daemon-systems.org/man/kvm_getproc2.3.html 和 PS 的来源:http: //bxr.su/o/bin/ps/ps.c

于 2013-06-09T04:00:42.890 回答
0

man ps您可以阅读有关T进程状态的信息:

T 标记一个停止的进程。

要确定进程是否停止,运行ps j将在列中显示T标志。stat

在 Bash 中显示所有当前停止的进程,运行:(jobs -s参见 参考资料help jobs)。要杀死他们,请运行:kill $(jobs -sp).

如果这些进程未附加到当前 shell,要显示所有停止的进程,此命令可能会有所帮助:

ps wuax | awk '$8 ~ "T"'

这是恢复所有已停止进程的命令:

kill -CONT $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

要终止这些进程,请替换-CONT-9.

如果您暂停了进程,它们将不会显示为已停止(带有T),因此要恢复它们,请改用以下命令:

pkill -CONT -u $UID

或对于特定进程(例如 Chrome),请尝试:

kill -CONT $(pgrep Chrome)
于 2016-03-24T23:57:04.723 回答