这是一个非常丑陋的 hack,它只支持一个 stdio 函数:fgetc()。其他可以添加,顺便说一句。它通过设置计时器来工作,如果在读取单个字符之前警报响起,则返回 -2 值(请记住:-1 表示 EOF)
它不适用于任何其他 curses 的 wgetXXX() 函数,这些函数可能会直接调用 fgetc() (等)。YMMV。
但是,在一般情况下,我认为您应该调查 wgetch_events()。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
sigjmp_buf the_jump;
int my_fgetc(FILE *fp, unsigned timeout);
void sig_handler(int signr);
void sig_handler(int signr) {
switch (signr) {
case SIGALRM:
siglongjmp(the_jump,1);
break;
default:
break;
}
}
int my_fgetc(FILE *fp, unsigned timeout)
{
alarm( timeout);
switch (sigsetjmp(the_jump, -1)) {
case 0:
alarm(0);
return fgetc (fp);
case 1:
return -2;
default:
return -3;
}
}
int main()
{
int rc;
signal(SIGALRM, sig_handler);
rc = setvbuf(stdin, NULL, _IONBF, 0);
printf("setvbuf(_IONBF) = %d\n", rc);
while (1) {
rc = my_fgetc(stdin, 1);
printf("my_fgetc(NULL) = %d\n", rc);
}
return 0;
}