Annotation of os2sdk/demos/examples/signal/signal.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * signal.c
                      3:  *
                      4:  * This example shows the useage of the signal handling capabilities of
                      5:  * OS/2.  The signal handler is declared as a far pascal routine.  It
                      6:  * expects two paramters on the stack: the signal number and, optionally,
                      7:  * a user defined argument.  The latter has meaning only when the signal was
                      8:  * generated by a DOSFLAGPROCESS api call.
                      9:  *
                     10:  * In general the signal handler can be thought of as an interrupt to
                     11:  * the current running thread of a process.  Thread scheduling is still
                     12:  * active.
                     13:  *
                     14:  * After a signal has been caught, the handler must "acknowledge" the signal
                     15:  * before a second one can be handled.
                     16:  */
                     17: 
                     18: #include <doscalls.h>
                     19: #include <subcalls.h>
                     20: #include <stdio.h>
                     21: 
                     22: #define SIGINTR 1
                     23: #define SIGTERM 3
                     24: #define SIGBREAK 4
                     25: #define CATCH_SIG 2
                     26: #define SIG_ACK 4
                     27: 
                     28: void pascal far sig_handler();
                     29: 
                     30: void main() {
                     31:     
                     32:     char       c;
                     33:     void       (pascal far *address)();
                     34:     unsigned   oldaction;
                     35:     unsigned   result;
                     36: 
                     37:     if (result = DOSSETSIGHANDLER(sig_handler,
                     38:                                  (unsigned long far *) &address,
                     39:                                  (unsigned far *) &oldaction,
                     40:                                  CATCH_SIG, SIGINTR))
                     41: 
                     42:        fprintf(stderr,"dossetsighandler failed %d\n", result);
                     43: 
                     44:     if (result = DOSSETSIGHANDLER(sig_handler,
                     45:                                  (unsigned long far *) &address,
                     46:                                  (unsigned far *) &oldaction,
                     47:                                  CATCH_SIG, SIGTERM))
                     48: 
                     49:        fprintf(stderr,"dossetsighandler failed %d\n", result);
                     50: 
                     51:     if( DOSGETMACHINEMODE( &c))
                     52:        if (result = DOSSETSIGHANDLER(sig_handler,
                     53:                                      (unsigned long far *) &address,
                     54:                                      (unsigned far *) &oldaction,
                     55:                                      CATCH_SIG, SIGBREAK))
                     56: 
                     57:            fprintf(stderr,"dossetsighandler failed %d\n", result);
                     58: 
                     59:     do
                     60:        printf("Type an SPACE to terminate demo\n");
                     61:     while(getchar() != 0x20);
                     62: 
                     63:     fprintf(stderr,"Program terminating\n");
                     64:     exit(0);
                     65: }
                     66: /*
                     67:  * The signal handler routine must ACKNOWLEDGE the signal before it can
                     68:  * capture another (of the same number).  Since this routine runs as
                     69:  * thread 0 it can be preempted by another.  If it is
                     70:  * important that all signals be caught, then Thread 0 should be run as
                     71:  * a high priority thread and always snoozing. Of course, the
                     72:  * acknowlegement should be the first thing done in the handler.
                     73:  */
                     74: void pascal far sig_handler(sig_arg, sig_num)
                     75: unsigned sig_arg, sig_num;
                     76: {
                     77:     unsigned signum, sigarg;
                     78:     long address;
                     79:     int count;
                     80: 
                     81:     fprintf(stderr, "signum %u sigarg %u\n", sig_num, sig_arg);
                     82: 
                     83:     if (count = DOSSETSIGHANDLER( (void (far *)())0L,
                     84:                                  (unsigned long far *) &address,
                     85:                                  (unsigned far *) &sigarg,
                     86:                                  SIG_ACK, sig_num))
                     87: 
                     88:        fprintf(stderr,"dossetsighandler failed %d\n", count);
                     89: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.