2011-11-02 30 views
1

我有一個項目很快就會使用信號和sighandlers,我基本上完成了它;然而,我被掛在一方。下面是從我老師的提示中粘貼的部分:「...當它接收到sigusr2時,它應該跳入或跳出 調試模式,例如,如果調試模式當前處於」打開「狀態,則應調用 關閉調試, 「關」,應該啓用調試。如何在我的程序中切換調試模式?

當調試「上」,你的程序應該報告 總每x秒,而忽略SIGUSR1。 調試時被「關閉」報警器應被關閉,你的程序 應該像以前一樣處理sigusr1(即報告總共 的狀態)「。

切換到調試模式到底意味着什麼?我熟悉的唯一調試模式是eclipse版本。問另一個同學,我得到了我想建立我自己的調試模式的迴應,我也不確定這是什麼意思。任何人都可以點亮一些光線並將我指向正確的方向嗎?感謝您的閱讀,並提前感謝您的幫助!

+1

你從教練那裏得到的迴應是什麼? *這是*你應該首先指出關於你任務的所有問題。 –

+0

當然啊。=)是的,我今天中午在中午與他聯繫過,但仍然沒有回覆(電子郵件),不幸的是截止日期是晚上11點 – Derek

+0

感謝所有人的幫助 – Derek

回答

2

暫時忘掉「調試」,只考慮您的程序需要有兩個模式。在一種模式下,它應該以某種方式行事,而在另一種模式中,它表現出不同的方式。

跟蹤兩個狀態的簡單方法是什麼?具有兩個(或更多)可能值的變量,例如bool。所以,聲明一個全局變量來跟蹤無論你在一個模式或其他(但因爲使用從信號處理全局變量bool不提供技術支持,使用sig_atomic_t代替):

​​

當您會收到控制程序所處模式的信號,更改變量的值,然後確保程序的行爲與該模式一致。如果您在調試模式下收到信號,並且您是而不是,那麼請設置in_debug_mode = true,設置您的SIGALRM處理程序,並禁用SIGUSR1處理程序。如果您收到信號,並且在調試模式下爲,則設置爲in_debug_mode = false,清除SIGALRM處理程序並設置SIGUSR1處理程序。

該模式的名稱是無關緊要的。就賦值而言,它被稱爲「調試模式」,但它與您可能熟悉的任何其他程序的調試功能無關。

+0

雖然我認爲這是未定義的行爲。您只能修改信號處理程序中的'sigatomic_t'。 –

3

它只是意味着你的程序保存有關調試級別的一些狀態信息,例如:

int debug_level = 0; 

void log(const char * message) 
{ 
    if (debug_level > 0) 
    { 
    printf("Debug message: %s\n", message); 
    } 
} 

那麼你可以說log("starting loop");或類似的東西在你的程序,它只會如果打印調試級別足夠高。

當您註冊信號處理程序時,您只需讓它修改全局變量debug_level。 (請務必使用類型sigatomic_t作爲變量,以確保您可以從信號處理程序內安全地進行修改!)

+0

好的,debug_level是如何得到更新的?從這裏開始,除非程序外部的東西會修改它,否則它會停留在0。 =) – Derek

+1

你的教授告訴你如何更新 - 通過信號SIGUSR2。寫一個信號處理程序(如Kerrek所說)來切換這個位。請參閱http://stackoverflow.com/questions/5473645/signal-handler-question – Matt

+0

@Derek:您是否還需要編寫信號處理程序的幫助?你應該說在你的問題中,或者說,提出一個不同的問題,「我如何在C中編寫信號處理程序」? –

相關問題