これは非常に醜いハックであり、単一のstdio関数fgetc()のみをサポートします。ところで、他のものを追加することができます。タイマーを設定することで機能します。1文字が読み取られる前にアラームが鳴ると、代わりに-2の値が返されます(覚えておいてください:-1はEOFを意味します)
fgetc()(etc)を直接呼び出す可能性のある他のcursesのwgetXXX()関数では機能しません。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;
}