From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/OR_USING_C/08.5.c | 85 +++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 reference/C/CONTRIB/OR_USING_C/08.5.c (limited to 'reference/C/CONTRIB/OR_USING_C/08.5.c') diff --git a/reference/C/CONTRIB/OR_USING_C/08.5.c b/reference/C/CONTRIB/OR_USING_C/08.5.c new file mode 100644 index 0000000..47b0402 --- /dev/null +++ b/reference/C/CONTRIB/OR_USING_C/08.5.c @@ -0,0 +1,85 @@ +#include +#include + +/* + * The environment for setjmp. + */ +jmp_buf env; + +main() +{ + int i; + char buf[16]; + extern int timeout(); + + /* + * Inform the system we want to catch the + * alarm signal. + */ + signal(SIGALRM, timeout); + + /* + * The code inside the if gets executed the first + * time through setjmp, the code inside the else + * the second time. + */ + if (setjmp(env) == 0) { + /* + * Issue a request for an alarm to be + * delivered in 15 seconds. + */ + alarm(15); + + /* + * Prompt for input. + */ + printf("Type a word; if you don't in 15 "); + printf("seconds I'll use \"WORD\": "); + gets(buf); + + /* + * Turn off the alarm. + */ + alarm(0); + } + else { + /* + * Assume the default. + */ + strcpy(buf, "WORD"); + } + + printf("\nThe word is: %s\n", buf); + exit(0); +} + +/* + * timeout--catch the signal. + */ +timeout(sig) +int sig; +{ + /* + * Ignore the signal for the duration of this + * routine. + */ + signal(sig, SIG_IGN); + + /* + * We would perform any timeout-related + * functions here; in this case there + * are none. + */ + + /* + * Restore the action of the alarm signal. + */ + signal(SIGALRM, timeout); + + /* + * Return to the main routine at setjmp, + * and make setjmp return 1. + */ + longjmp(env, 1); +} + -- cgit v1.2.3-54-g00ecf