c语言 detchar ,getchar,perintf。是不是都可以用perintf
#include
#include
#include
#include
#include
#include
void handler(int sig)
{
if (sig != SIGALRM)
{
printf("Invalid signal %d
", sig);
}
}
int mygetchar(int wait)
{
char ch;
int size, ret, clear;
struct sigaction act, old;
struct itimerval timer;
if (wait <= 0)
return -3;
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGALRM, &act, &old);
/* set timer */
memset(&timer, 0, sizeof(timer));
timer.it_value.tv_sec = wait;
setitimer(ITIMER_REAL, &timer, NULL);
size = read(STDIN_FILENO, &ch, sizeof(ch));
clear = 1; /* assume we should disable timer after reading */
if (size == 0) /* eof */
{
ret = -1;
}
else if (size == -1 && errno == EINTR) /* timeout */
{
ret = -2;
clear = 0;
}
else if (size < 0) /* other errors */
{
ret = -3;
}
else
{
ret = ch;
}
if (clear)
{
/* disable the running timer */
timer.it_value.tv_sec = 0;
setitimer(ITIMER_REAL, &timer, NULL);
}
sigaction(SIGALRM, &old, NULL); /* restore sig action */
return ret;
}
int main()
{
int ch;
time_t t;
printf("input a char in 3 seconds
");
ch = mygetchar(3);
t = time(NULL);
if (ch < 0)
printf("mygetchar returns %d, at %s
", ch, ctime(&t));
else
printf("get char '%c', at %s
", ch, ctime(&t));
return 0;
}