【问题标题】:Determine if process is paused (with SIGSTOP) on OS X with C使用 C 在 OS X 上确定进程是否暂停(使用 SIGSTOP)
【发布时间】:2013-06-09 02:40:42
【问题描述】:

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

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

【问题讨论】:

    标签: c macos signals


    【解决方案1】:

    这就是你的做法:

    #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;
    }
    

    【讨论】:

      【解决方案2】:

      这不是一个很好的答案,但它是一个答案.. 您可以运行 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

      【讨论】:

        【解决方案3】:

        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)
        

        【讨论】:

          猜你喜欢
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多