2013-12-10 85 views
2

我有一個程序需要它暫停和恢復另一個程序。要做到這一點,我使用kill功能,可以通過代碼: -暫停進程時的基礎機制

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

,或者在命令行與同類

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

我能追查這是怎麼回事使用this code線程,取自Mac OS X Internals

如果程序暫停並立即恢復,則線程狀態可顯示爲不可中斷。大多數時候,他們報告爲WAITING,這並不奇怪,如果一個線程正在工作,它將顯示爲RUNNING。

我不明白的是,當我暫停程序並查看線程的狀態時,它們仍顯示爲WAITING。我本來期望他們的狀態是要麼已停止 HALTED

有人能解釋爲什麼他們仍然顯示爲WAITING,他們何時會已停止HALTED。另外,是否有另一種結構顯示程序的狀態,並且它的線程以這種方式被暫停?

回答

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,程序運行,否則處於暫停狀態,等待恢復。

1

您的情況顯示爲「等待」,因爲您沒有終止程序而是將其暫停,其中由於運行時錯誤導致程序立即停止工作時,通常會發生停止或停止狀態。就你的第二個問題而言,我認爲還沒有其他的結構來顯示程序的狀態。乾杯

+0

謝謝你,你說的是對的國家,但不是缺乏一個結構來顯示該計劃的狀態。 – TheDarkKnight