/* * SPDsoft * * Simple signal example * Define _BSD_ for SunOS * Define _HPUX_SOURCE for HPUX */ #include #include #include #include #include #ifdef _BSD_ # include extern char *sys_errlist[]; # ifndef __USE_POSIX # define raise(s) kill(getpid(),(s)) /* not using glibc */ # endif # define strerror(e) sys_errlist[(e)] #endif /* Prototypes */ void rserv(int i); void rserv5(int i); int main ( int argc, char *argv[]); /* Globals */ #define MY_SIG SIGINT /*#define MY_SIG SIGUSR1*/ char *progname; int count=0; void rserv(int i) { /* set MY_SIG again */ if ( SIG_ERR == signal(MY_SIG, rserv)) fprintf(stderr,"%s: Error: %s\n",progname,strerror(errno)); printf("%s: Hola! (signal %d)\n", progname, i); fflush(stdout); count ++; return; } void rserv5(int i) { printf("%s: Hola! 5 (signal %d)\n", progname, i); fflush(stdout); sleep(5); count ++; return; } int main ( int argc, char *argv[]) { int i; unsigned int s; void (*sys)(int); if (argc != 3) { printf ("Uso: %s nloops sleep\n", argv[0]); exit(1); } progname = argv[0]; s=atoi(argv[2]); fprintf(stderr,"%s: %p\n", argv[0], sys); if ( SIG_ERR == (sys = signal(MY_SIG, rserv))) fprintf(stderr,"%s: Error: %s\n",argv[0],strerror(errno)); else fprintf(stderr,"%s: %p\n", argv[0], sys); for (i = atoi(argv[1]); i > 0; i--) { sleep(s); raise(MY_SIG); } signal(MY_SIG, sys ); sigset(MY_SIG, rserv5); sighold(MY_SIG); printf("b %d\n",count); sigpause(MY_SIG); printf("c %d\n",count); printf("in sleep\n"); sighold(MY_SIG); sleep(5); printf("out sleep\n"); sigpause(MY_SIG); printf("d %d\n",count); puts("bye"); return 0; }