| 1 | .\" -*-nroff-*- |
| 2 | .TH sel 3 "23 July 1999" "Straylight/Edgeware" "mLib utilities library" |
| 3 | .SH NAME |
| 4 | sig \- more controlled signal handling |
| 5 | .\" @sig_init |
| 6 | .\" @sig_add |
| 7 | .\" @sig_remove |
| 8 | .SH SYNOPSIS |
| 9 | .nf |
| 10 | .B "#include <mLib/sig.h>" |
| 11 | |
| 12 | .ds mT \fBvoid sig_add( |
| 13 | .BI "\*(mTsig *" s ", int " n , |
| 14 | .BI "\h'\w'\*(mT'u'void (*" proc ")(int " n ", void *" p "), void *" p ); |
| 15 | .BI "void sig_remove(sig *" s ); |
| 16 | .BI "void sig_init(sel_state *" s ); |
| 17 | .fi |
| 18 | .SH "DESCRIPTION" |
| 19 | The |
| 20 | .B sig |
| 21 | subsystem uses the I/O multiplexing capabilities of |
| 22 | .B mLib |
| 23 | (see |
| 24 | .BR sel (3) |
| 25 | for details) to provide a more convenient interface for handling signals |
| 26 | which don't need to be dealt with `right away'. Like the I/O system, |
| 27 | .B sig |
| 28 | doesn't allocate any memory for itself: you have to give it space to |
| 29 | work in. |
| 30 | .PP |
| 31 | The system needs to be initialized before use. To do this, you must |
| 32 | call |
| 33 | .BR sig_init , |
| 34 | passing it the address of an initialized multiplexor object. Signals |
| 35 | handled through this interface will only be delivered when |
| 36 | .BR sel_select (3) |
| 37 | is called on that multiplexor. |
| 38 | .PP |
| 39 | To register interest in a signal, call |
| 40 | .BR sig_add , |
| 41 | passing it the following arguments: |
| 42 | .TP |
| 43 | .BI "sig *" s |
| 44 | A pointer to an (uninitialized) object of type |
| 45 | .BR sig . |
| 46 | This will be used by the system to retain information about this signal |
| 47 | claim. You use the address of this object to remove the handler again |
| 48 | when you've finished. |
| 49 | .TP |
| 50 | .BI "int " n |
| 51 | The number of the signal you want to handle. |
| 52 | .PP |
| 53 | .TP |
| 54 | .BI "void (*" proc ")(int " n ", void *" p ) |
| 55 | A function to call when the signal is detected. The function is passed |
| 56 | the signal number and the pointer |
| 57 | .I p |
| 58 | passed to |
| 59 | .BR sig_add . |
| 60 | .TP |
| 61 | .BI "void *" p |
| 62 | A pointer argument to be passed to |
| 63 | .I func |
| 64 | when the signal is detected. |
| 65 | .PP |
| 66 | Removing a handler is easy. Call |
| 67 | .B sig_remove |
| 68 | with the address of the |
| 69 | .B sig |
| 70 | structure you passed to |
| 71 | .BR sig_add . |
| 72 | .SS "Multiple signal handlers" |
| 73 | You may have multiple signal handlers for a signal. All of them are |
| 74 | called in some unspecified order when the signal occurs. |
| 75 | .PP |
| 76 | A signal's disposition is remembered when a handler for it is added and |
| 77 | there are no handlers already registered. When the last handler for a |
| 78 | signal is removed, its disposition is restored to its initial remembered |
| 79 | state. |
| 80 | .SH "BUGS AND CAVEATS" |
| 81 | The |
| 82 | .B sig |
| 83 | system attempts to set the |
| 84 | .B SA_RESTART |
| 85 | flag on signal handlers it creates that signal occurrences don't |
| 86 | interrupt system calls. This won't be done on systems which don't |
| 87 | define this flag, for obvious reasons. |
| 88 | .PP |
| 89 | The |
| 90 | .B SA_NOCLDSTOP |
| 91 | flag is also set, so that stopped child processes aren't reported by a |
| 92 | signal. This is normally right, but ought to be configurable. |
| 93 | .SH "AUTHOR" |
| 94 | Mark Wooding, <mdw@distorted.org.uk> |