select(2) ループを試してください: https://www.mirbsd.org/man2/selectを stdin (fd#0) で 5 秒のタイムアウトで。データがあることを示す select が返された場合にのみ、scanf(3) を実行します。(例については、mksh ソース コードの c_read() 関数を参照してください。)
poll(2) のような他の関数も可能です。ノンブロッキング I/O は少し過剰です。
OK、これは select を使った (MirBSD での) 動作例です:
#include <sys/types.h>
#include <sys/time.h>
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int
main(void)
{
int value = 0;
struct timeval tmo;
fd_set readfds;
printf("Enter a non-zero number: ");
fflush(stdout);
/* wait only 5 seconds for user input */
FD_ZERO(&readfds);
FD_SET(0, &readfds);
tmo.tv_sec = 5;
tmo.tv_usec = 0;
switch (select(1, &readfds, NULL, NULL, &tmo)) {
case -1:
err(1, "select");
break;
case 0:
printf("User dont give input");
return (1);
}
scanf("%d", &value);
if (value != 0) {
printf("User input a number");
} else {
printf("User dont give input");
}
return (0);
}
終了コードを少しいじって、コード全体にいくつかの \n を散りばめたいと思うかもしれません。最初fflush(stdout);
にプロンプトが表示されるようにするために重要です…</p>