2011-11-02 20 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中编写信号处理程序”? –

相关问题