【发布时间】:2013-06-09 02:40:42
【问题描述】:
给定一个进程的 pid,我如何确定该进程是暂停(使用 SIGSTOP)还是正在运行?
我使用的是 OS X,所以我没有 /proc 目录。
【问题讨论】:
给定一个进程的 pid,我如何确定该进程是暂停(使用 SIGSTOP)还是正在运行?
我使用的是 OS X,所以我没有 /proc 目录。
【问题讨论】:
这就是你的做法:
#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;
}
【讨论】:
这不是一个很好的答案,但它是一个答案.. 您可以运行 ps aux(从您的程序中)并查看 STAT 列是否为 T(停止)。刚刚在山狮身上查过了。
不确定它是如何计算出来的。
我想我越来越接近 kvm_* 功能了:
Get other process' argv in OS X using C
还有
kvm_getargv()
http://www.daemon-systems.org/man/kvm_getproc2.3.html 以及PS的来源:http://bxr.su/o/bin/ps/ps.c
【讨论】:
在man ps 你可以阅读T 进程的状态:
T标记一个停止的进程。
要确定进程是否停止,运行ps j 将在stat 列中显示T 标志。
在 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)
【讨论】: