#include #include #include #include #include extern int errno; void usr1(int sig) ; void usr2(int sig) ; void hup(int sig) ; void intr(int sig); int loop=1; pid_t mypid; int counter=0; main () { char buf[100]; int len; mypid = getpid(); if ( SIG_ERR == signal(SIGUSR1, usr1)) { perror("Unable to set signal handler"); } if ( SIG_ERR == signal(SIGUSR2, usr2)) { perror("Unable to set signal handler"); } if ( SIG_ERR == signal(SIGHUP, hup)) { perror("Unable to set signal handler"); } if ( SIG_ERR == signal(SIGINT, intr)) { perror("Unable to set signal handler"); } printf("The process (%d) is set for a USR1, USR2, HUP, INT\n",mypid); while (loop) { } printf("Out of the loop, type something in\n"); doover: len = read(0,buf,100); buf[len-1]='\0'; printf("We were able to read a <%s>, len = %d\n",buf,len); if (errno == EINTR) { errno = 0; printf("In doover loop\n"); goto doover; } } void usr1(int sig){ printf("In usr1, got %d\n",sig); raise(SIGUSR1); usleep(100); if ( SIG_ERR == signal(SIGUSR1,SIG_DFL)) { perror("Unable to set signal handler"); } } void usr2(int sig){ printf("In usr2, got %d\n",sig); } void hup(int sig){ printf("In hup, got %d\n",sig); printf (" Resetting SIGHUP handler \n"); kill (mypid,sig); printf("counter=%d\n",counter++); if ( SIG_ERR == signal(SIGHUP, SIG_DFL)) { perror("Unable to set signal handler"); } printf("counter=%d\n",counter--); sleep(3); printf("After sleep in hup\n"); } void intr(int sig){ printf("In intr, got %d,error=%d\n",sig,errno); if ( SIG_ERR == signal(SIGINT, intr)) { perror("Unable to set signal handler"); } loop=0; }