尝试一个 select(2) 循环:https ://www.mirbsd.org/man2/select on stdin (fd#0),超时 5 秒;仅当 select 返回指示有数据时才运行 scanf(3)。(有关示例,请参见 mksh 源代码中的 c_read() 函数。)
其他函数,如 poll(2),也是可能的。非阻塞 I/O 有点矫枉过正。
好的,这是一个使用 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>