假设我们在Linux上有应用程序,纯C.应用程序包含几个函数 - f1
,f2
和f3
,它们接收一个结构。结构的一个元素是debug_mode
,其值为ON
或OFF
。
当结构具有f1
时,如何在f2
,f3
和printf
(例如,某些debug_mode == ON
)中切换调试模式?< / p>
我是否应始终使用if
语句检查每个传入结构的debug_mode
,还是有其他最佳做法不使用始终if
语句?
例如,这些可能是电信产品中的痕迹,我们可以为指定用户收集一些跟踪数据。
答案 0 :(得分:1)
您可以在运行时更改它,如下所示:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#define FALSE 0
#define TRUE 1
volatile sig_atomic_t GLOBAL_DEBUG = FALSE;
void sig_handler(int signo)
{
if (signo == SIGUSR1) {
// printf("received SIGUSR1\n");
GLOBAL_DEBUG = TRUE;
} else if (signo == SIGUSR2) {
GLOBAL_DEBUG = FALSE;
// printf("received SIGUSR2\n");
}
}
int main (int argc, char **argv) {
if (signal(SIGUSR1, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGUSR1\n");
if (signal(SIGUSR2, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGUSR2\n");
while (TRUE) {
if (GLOBAL_DEBUG) printf ("DEBUG == TRUE\n");
printf ("Hello world\n");
sleep(1);
}
}
在运行时期间切换GLOBAL_DEBUG如下:
user@host:~ $ kill -SIGUSR2 <pid of program>
user@host:~ $ kill -SIGUSR1 <pid of program>
BTW,请阅读signal-safety(7)(解释信号处理程序中应避免printf
的原因)和signal(7)。 sig_atomic_t
在C11标准中指定(请参阅n1570)。
答案 1 :(得分:1)
您可以使用信号(请参阅signal(7)&amp; signal-safety(7)),如mbieren's answer中所述。当然,您无法从信号处理程序中调用printf
(或任何非异步信号安全函数),并且该标志应be declared为volatile sig_atomic_t GLOBAL_DEBUG;
你可以设计你的程序。也许你的程序已经有一些事件循环(例如,因为它是一个GUI应用程序)。然后,您可以向您的程序添加一些RPCJSON服务(或一些HTTP,或您自己的socket(7)或unix(7)协议,可能只有一些text-based)。您将找到许多库来帮助您(例如,libonion使您能够向程序添加一些HTTP服务;因此您可以通过Web服务器更改调试标志!)。
您没有充分了解您的计划以获得更准确的帮助。