Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

324 Signals Chapter 10


Then the prototype becomes
Sigfunc *signal(int, Sigfunc *);
We’ve included thistypedefinapue.h(Appendix B) and use it with the functions in
this chapter.
If we examine the system’s header<signal.h>, we will probably find declarations
of the form
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
These constants can be used in place of the ‘‘pointer to a function that takes an integer
argument and returns nothing,’’the second argument tosignal,and the return value
fromsignal.The three values used for these constants need not be−1, 0, and 1. They
must be three values that can never be the address of any declarable function. Most
UNIX systems use the values shown.

Example


Figure10.2 shows a simple signal handler that catches either of the two user-defined
signals and prints the signal number.InSection 10.10, we describe thepausefunction,
which simply suspends the calling process until a signal is received.
#include "apue.h"
static void sig_usr(int); /* one handler for both signals */
int
main(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("can’t catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("can’t catch SIGUSR2");
for ( ; ; )
pause();
}
static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
err_dump("received signal %d\n", signo);
}

Figure 10.2 Simple program to catchSIGUSR1andSIGUSR2
Free download pdf