245 lines · 6.3 KB · Text
RawDownload
.TH NOTIFY 2.SH NAMEnotify, noted, atnotify \- handle asynchronous process notification.SH SYNOPSIS.B #include <u.h>.br.B #include <libc.h>.PP.Bint notify(void (*f)(void*, char*)).PP.Bint noted(int v).PP.Bint atnotify(int (*f)(void*, char*), int in).SH DESCRIPTIONWhen a process raises an exceptional condition such as dividing by zeroor writing on a closed pipe, a.I noteis posted to communicate the exception.A note may also be posted by a.I write(see.IR read (2))to the process's.BI /proc/ n /notefile or to the.BI /proc/ m /notepgfile of a process in the same process group (see.IR proc (3)).When the note is receivedthe behavior of the process depends on the origin of the note.If the note was posted by an external process,the process receiving the note exits;if generated by the system the note string,preceded by the nameand id of the process and the string\fL"suicide: "\fP,is printed on the process's standard error fileand theprocess is suspended in the.B Brokenstate for debugging..PPThese default actions may be overridden.The.I notifyfunction registers a.I "notification handlerto be called within the process when a note is received.The argument to.I notifyreplaces the previous handler, if any.An argument of zero cancels a previous handler,restoring the default action.A.IR fork (2)system call leaves the handler registered inboth the parent and the child;.IR exec (2)restores the default behavior.Handlers may not perform floating point operations..PPAfter a note is posted,the handler is called with two arguments:the first is a pointer to a.B Uregstructure (defined in.BR /$objtype/include/ureg.h )giving the current values of registers;the second is a pointer to the note itself,a null-terminated string with no more than.L ERRLENcharacters in it including the terminal NUL.The.B Uregargument is usually not needed; it is provided to help recover from traps suchas floating point exceptions.Its use and layout are machine- and system-specific..PPA notification handler must finish either by exiting the program or by calling.IR noted ;if the handler returns the behavioris undefined and probably erroneous.Until the program calls.IR noted ,any further externally-generated notes(e.g.,.B hangupor.BR alarm )will be held off, and any further notes generated byerroneous behavior by the program(such as divide by zero) will kill the program.The argument to.I noteddefines the action to take:.B NDFLTinstructs the system to perform the default actionas if the handler had never been registered;.B NCONTinstructs the system to resume the processat the point it was notified.In neither case does.I notedreturn to the handler.If the note interrupted an incomplete system call,that call returns an error (with error string.BR interrupted )after the process resumes.A notification handler can also jump out to an environmentset up with.I setjmpusing the.I notejmpfunction (see.IR setjmp (2)),which is implemented by modifying the saved state and calling.BR noted(NCONT) ..PPRegardless of the origin of the note or the presence of a handler,if the process is being debugged(see.IR proc (3))the arrival of a note puts the process in the.B Stoppedstate and awakens the debugger..SS AtnotifyRather than using the system calls.I notifyand.IR noted ,most programs should use.I atnotifyto register notification handlers.The parameter.I inis non-zero to register the function.IR f ,and zero to cancel registration.A handler must return a non-zero numberif the note was recognized (and resolved);otherwise it must return zero.When the system posts a note to the process,each handler registered with.I atnotifyis called with arguments asdescribed aboveuntil one of the handlers returns non-zero.Then.I notedis called with argument.BR NCONT .If no registered function returns non-zero,.I atnotifycalls.I notedwith argument.BR NDFLT ..SS APE.I Notedhas two other possible values for its argument..B NSAVEreturns from the handler and clears the note, enabling the receipt of another,but does not return to the program.Instead it starts a new handler with the same stack, stack pointer,and arguments as theoriginal, at the address recorded in the program counter of the.B Uregstructure.  Typically, the program counter will be overridden by thefirst note handler to be the address of a separate function;.B NSAVEis then a `trampoline' to that handler.That handler may executed.B noted(NRSTR)to return to the original program, usually after restoring the original programcounter..B NRSTRis identical to.BR NCONTexcept that it can only be executed after an.BR NSAVE ..B NSAVEand.B NRSTRare designed to improve the emulation of signals by the ANSI C/POSIXenvironment; their use elsewhere is discouraged..SS NotesThe set of notes a process may receive is system-dependent, but thereis a common set that includes:.PP.RS 3n.nf.ta \w'\fLsys: write on closed pipe  \fP'u\fINote\fP	\fIMeaning\fP\fLinterrupt\fP	user interrupt (DEL key)\fLhangup\fP	I/O connection closed\fLalarm\fP	alarm expired\fLsys: breakpoint\fP	breakpoint instruction\fLsys: bad address\fP	system call address argument out of range\fLsys: odd address\fP	system call address argument unaligned\fLsys: bad sys call\fP	system call number out of range\fLsys: odd stack\fP	system call user stack unaligned\fLsys: write on closed pipe\fP	write on closed pipe\fLsys: fp: \fIfptrap\f1	floating point exception\fLsys: trap: \fItrap\f1	other exception (see below).fi.RE.PPThe notes prefixed.B sys:are generated by the operating system.They are suffixed by the user program counter in format.BR pc=0x1234 .If the note is due to a floating point exception, just before the.BR pcis the address of the offending instruction in format.BR fppc=0x1234 .Notes are limited to.B ERRLENbytes; if they would be longer they are truncated but the.B pcis always reported correctly..PPThe types and syntax of the.I trapand.I fptrapportions of the notes are machine-dependent..SH SOURCE.B /sys/src/libc/9syscall.br.B /sys/src/libc/port/atnotify.c.SH SEE ALSO.IR intro (2),.IR postnote (2),.I notejmpin.IR setjmp (2).SH BUGSSince.IR exec (2)discards the notification handler, there is a windowof vulnerability to notes in a new process.