我编写了一个简单的命令行工具,它使用getchar来等待终止信号(类似于:'按Enter键停止')。然而,我也想处理SC_CLOSE案例(单击“关闭”按钮)。我是通过使用SetConsoleCtrlHandler完成的。但是如何取消我的getchar?
fputc('\n', stdin);
,但这会导致死锁。答案 0 :(得分:4)
也许有某种类型的getchar超时,我可以调用它?
您可以异步读取控制台输入:
#ifdef WIN32
#include <conio.h>
#else
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#endif
int main(int argc, char* argv[])
{
while(1)
{
#ifdef WIN32
if (kbhit()){
return getc(stdin);
}else{
Sleep(1000);
printf("I am still waiting for your input...\n");
}
#else
struct timeval tWaitTime;
tWaitTime.tv_sec = 1; //seconds
tWaitTime.tv_usec = 0; //microseconds
fd_set fdInput;
FD_ZERO(&fdInput);
FD_SET(STDIN_FILENO, &fdInput);
int n = (int) STDIN_FILENO + 1;
if (!select(n, &fdInput, NULL, NULL, &tWaitTime))
{
printf("I am still waiting for your input...\n");
}else
{
return getc(stdin);
}
#endif
}
return 0;
}
通过这种方式,您可以引入bool bExit
标志,指示您的程序是否需要终止。您可以在专用线程中读取输入或将此代码包装到函数中并定期调用它。