Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

Section 10.10 alarmandpauseFunctions 341


#include "apue.h"
unsigned int sleep2(unsigned int);
static void sig_int(int);
int
main(void)
{
unsigned int unslept;
if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal(SIGINT) error");
unslept = sleep2(5);
printf("sleep2 returned: %u\n", unslept);
exit(0);
}
static void
sig_int(int signo)
{
int i, j;
volatile int k;
/*
*Tune these loops to run for more than 5 seconds
* on whatever system this test program is run.
*/
printf("\nsig_int starting\n");
for (i = 0; i < 300000; i++)
for (j = 0; j < 4000; j++)
k += i * j;
printf("sig_int finished\n");
}

Figure 10.9 Callingsleep2from a program that catches other signals

When we execute the program shown in Figure10.9 and interrupt the sleep by
typing the interrupt character, we get the following output:
$./a.out
ˆC we type the interrupt character
sig_int starting
sleep2 returned: 0
We can see that thelongjmpfrom the sleep2function aborted the other signal
handler,sig_int,even though it wasn’t finished. This is what you’ll encounter if you
mix the SVR2sleepfunction with other signal handling. See Exercise 10.3.

The purpose of thesleep1andsleep2examples is to show the pitfalls in dealing
naively with signals. The following sections will show ways around all these problems,
so we can handle signals reliably,without interfering with other pieces of code.
Free download pdf