【问题标题】:Underlying mechanism when pausing a process暂停进程时的底层机制
【发布时间】:2013-12-27 17:55:27
【问题描述】:

我有一个程序需要它暂停和恢复另一个程序。为此,我使用 kill 函数,或者来自以下代码:-

kill(pid, SIGSTOP); // to pause
kill(pid, SIGCONT); // to resume

或者从命令行类似

kill -STOP <pid>
kill -CONT <pid>

我可以使用来自Mac OS X Internalsthis code 跟踪线程的情况。

如果程序暂停并立即恢复,线程的状态可以显示为UNINTERRUPTIBLE。大多数情况下,它们报告为 WAITING,这并不奇怪,如果线程正在工作,它将显示为 RUNNING。

我不明白的是,当我暂停程序并查看线程的状态时,它们仍然显示为 WAITING。我本来希望他们的状态是 STOPPEDHALTED

谁能解释为什么他们仍然显示为WAITING,他们什么时候会STOPPEDHALTED。此外,是否有其他结构显示程序的状态及其线程以这种方式停止?

【问题讨论】:

    标签: c macos pthreads kernel signals


    【解决方案1】:

    在您的情况下显示“正在等待”,因为您没有终止程序而是暂停了它,而当程序由于某些运行时错误而立即停止工作时,通常会出现已停止或暂停状态。就您的第二个问题而言,我认为没有其他结构可以显示程序的状态。干杯

    【讨论】:

    • 谢谢,您对状态的看法是正确的,但不是因为缺少显示程序状态的结构。
    【解决方案2】:

    在对可用结构进行研究和试验后,我发现可以通过查看进程挂起计数来显示程序被暂停的状态。这是我的解决方案:-

    int ProcessIsSuspended(unsigned int pid)
    {
        kern_return_t kr;
        mach_port_t task;
        mach_port_t mytask;
    
        mytask = mach_task_self();
    
        kr = task_for_pid(mytask, pid, &task);
        // handle error here...
    
        char infoBuf[TASK_INFO_MAX];
        struct task_basic_info_64 *tbi;
    
        int infoSize = TASK_INFO_MAX;
        kr = task_info(task, TASK_BASIC_INFO_64, (task_info_t)infoBuf, (mach_msg_type_number_t *)&infoSize);
        // handle error here....
    
        tbi = (struct task_basic_info_64 *) infoBuf;
        if(tbi->suspend_count > 0) // process is suspended
            return 1;
    
        return 0;
    }
    

    如果suspend_count为0,程序正在运行,否则处于暂停状态,等待恢复。

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多