我想用以下结构实现C应用程序:
int main()
{
initSystem();
while (1)
{
//do something
}
deinitSystem();
return EXIT_SUCCESS;
}
因此,执行该软件时发生的情况是,它进入了
while(1)
循环并且没有退出,而是按正常方式进行处理。但是问题是,如果我想停止应用程序,则需要它在关闭之前调用deinitSystem()
,因此仅在终端上使用Ctrl + C或killall myprogram
杀死应用程序是行不通的;我需要向其发送一条命令,说“嘿,时间到了”,中断while循环并运行deinitSystem
。我这样做的通常方法是将键盘阅读器放入循环的一部分,因此,如果阅读器读取了exit命令,则会中断循环。但这必须是一个无阻塞的键盘阅读器,而且我找不到在C + Linux中执行此操作的任何有效方法。我发现这样做的唯一方法是创建一个线程,以便仅从Keyboard读取此退出命令,并用标志中断while循环,但我不喜欢这种解决方案。我想知道是否有另一种实现此方法的方法,而不必只使用线程来读取键盘。
最佳答案
传统方式是(最好使用sigaction()
)为SIGINT
以及其他信号建立信号处理程序。您可以为while
循环设置一个标志,例如:
static volatile sig_atomic_t keep_looping = true;
并在您的处理程序中:
void handler(int signum) {
keep_looping = false;
}
然后在您的主程序中,循环:
while ( keep_looping ) { ...
它将继续进行,直到程序捕获
SIGINT
,设置标志,然后循环结束,此时您可以调用deinitSystem()
或其他任何内容,然后正常退出。