我有一个关于使用信号和sighandlers的项目,我基本上完成了它;但是我挂了一部分。这是从我老师的提示中粘贴的部分:“...当它收到sigusr2时,它应切换到或关闭一个 调试模式,例如如果调试模式当前“打开”它应该 关闭调试,如果调试“关闭”它应该打开调试。
当调试“开启”时,您的程序应该报告 总计每x秒并忽略sigusr1。 当调试“关闭”时,应关闭警报和程序 应该像以前一样处理sigusr1(即报告状态 总计)“。
切换到调试模式到底意味着什么?我熟悉的唯一调试模式是eclipse版本。问了另一个同学,我得到了我想要建立自己的调试模式的响应,我也不确定这意味着什么。任何人都可以解决一些问题并将我指向正确的方向吗?感谢您的阅读,并提前感谢您的帮助!
答案 0 :(得分: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
,以确保您可以在信号处理程序中安全地修改它!)
答案 1 :(得分:2)
暂时忘掉“调试”,只考虑你的程序需要有两个模式。在一种模式下,它应该以某种方式运行,而在另一种模式下,它的行为方式不同。
跟踪两个州的简单方法是什么?具有两个(或更多)可能值的变量,例如bool
。因此,声明一个全局变量来跟踪您是处于一种模式还是另一种模式(但由于在技术上不支持使用信号处理程序中的全局bool
变量,请改为使用sig_atomic_t
):
sig_atomic_t in_debug_mode;
当您收到控制程序所处模式的信号时,请更改变量的值,然后确保程序的行为与该模式一致。如果您收到信号并且您在调试模式下不,则设置in_debug_mode = true
,设置SIGALRM处理程序,并禁用SIGUSR1处理程序。如果收到信号并且 处于调试模式,则设置in_debug_mode = false
,清除SIGALRM处理程序,并设置SIGUSR1处理程序。
该模式的名称无关紧要。出于赋值的目的,它被称为“调试模式”,但它与您可能熟悉的任何其他程序的调试功能无关。