summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/OR_USING_C/08.5.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/OR_USING_C/08.5.c')
-rw-r--r--reference/C/CONTRIB/OR_USING_C/08.5.c85
1 files changed, 85 insertions, 0 deletions
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 <signal.h>
+#include <setjmp.h>
+
+/*
+ * 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);
+}
+