暂停进程时的基础机制

时间:2013-12-10 09:34:10

标签: c macos pthreads kernel signals

我有一个程序要求它暂停和恢复另一个程序。为此,我使用kill函数,使用代码: -

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

或者从类似

的命令行
kill -STOP <pid>
kill -CONT <pid>

我可以使用来自this codeMac OS X Internals跟踪线程的内容。

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

我不明白的是当我暂停一个程序并查看线程的状态时,它们仍显示为 WAITING 。我原本预计他们的状态要么是停止,要么是 HALTED

有人可以解释为什么他们仍然显示为等待,他们何时会停止 HALTED 。另外,是否有另一个结构显示程序的状态,并以这种方式停止其线程?

2 个答案:

答案 0 :(得分:1)

在您的情况下显示“Waiting”,因为您没有终止程序而是暂停它,当程序由于某些运行时错误而立即停止工作时通常会发生Stopped或Halted状态。就你的第二个问题而言,我认为没有其他结构可以显示该计划的状态。干杯

答案 1 :(得分:0)

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

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,程序正在运行,否则它处于暂停状态,等待恢复。