【问题标题】:Determine if a process has suspended确定进程是否已暂停
【发布时间】:2013-02-26 04:12:22
【问题描述】:

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

【问题讨论】:

  • 上下文通常会有所帮助。你为什么想知道?你到底想做什么?
  • 只是出于好奇,我想在 C 程序中执行此操作
  • 我相信您对 C 的局限性感到困惑; C 甚至不需要多个进程,这是您提出问题的先决条件。因此,这不是 C 题。如果您研究“我如何确定进程是否已在 [insert operating system info here] 中暂停?”,那么您可能会想出一个更好的答案。
  • @modifiablelvalue "如果进程在 [在此处插入操作系统信息] 中暂停,如何以编程方式确定?"否则,这也可以迁移到超级用户。

标签: c++ c process operating-system signals


【解决方案1】:

读自/proc/[pid]/stat

man page,您可以从此文件中获取进程的状态:

状态 %c

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

【讨论】:

  • @anthony-arnold ,用户需要 15 声望才能投赞成票,因为我觉得你的回答很好,我会代表他投。
  • 可惜这在 Mac 上不起作用。但是您始终可以将ps 作为子进程运行。
  • @vy32 没错,这只是做这件事的几种不同报酬之一。在不了解提问者的环境的情况下,我无法制定完整的答案。
  • 非常感谢。我还需要4个去!很好的帮助!
【解决方案2】:

我知道这是一篇旧帖子,但适合像我一样好奇的人!

简单的答案是只有一种静态的、一致的方式来检查状态,它来自/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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多