我想用以下结构实现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()或其他任何内容,然后正常退出。

10-07 13:01
查看更多