diff options
Diffstat (limited to 'man3p/sigwaitinfo.3p')
-rw-r--r-- | man3p/sigwaitinfo.3p | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/man3p/sigwaitinfo.3p b/man3p/sigwaitinfo.3p new file mode 100644 index 000000000..113ac95ab --- /dev/null +++ b/man3p/sigwaitinfo.3p @@ -0,0 +1,263 @@ +.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved +.TH "SIGTIMEDWAIT" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual" +.\" sigtimedwait +.SH NAME +sigtimedwait, sigwaitinfo \- wait for queued signals (\fBREALTIME\fP) +.SH SYNOPSIS +.LP +\fB#include <signal.h> +.br +.sp +int sigtimedwait(const sigset_t *restrict\fP \fIset\fP\fB, +.br +\ \ \ \ \ \ siginfo_t *restrict\fP \fIinfo\fP\fB, +.br +\ \ \ \ \ \ const struct timespec *restrict\fP \fItimeout\fP\fB); +.br +int sigwaitinfo(const sigset_t *restrict\fP \fIset\fP\fB, +.br +\ \ \ \ \ \ siginfo_t *restrict\fP \fIinfo\fP\fB); \fP +\fB +.br +\fP +.SH DESCRIPTION +.LP +The \fIsigtimedwait\fP() function shall be equivalent to \fIsigwaitinfo\fP() +except that if none of the signals specified by +\fIset\fP are pending, \fIsigtimedwait\fP() shall wait for the time +interval specified in the \fBtimespec\fP structure +referenced by \fItimeout\fP. If the \fBtimespec\fP structure pointed +to by \fItimeout\fP is zero-valued and if none of the +signals specified by \fIset\fP are pending, then \fIsigtimedwait\fP() +shall return immediately with an error. If \fItimeout\fP +is the NULL pointer, the behavior is unspecified. \ If the Monotonic +Clock option is supported, the CLOCK_MONOTONIC +clock shall be used to measure the time interval specified by the +\fItimeout\fP argument. +.LP +The \fIsigwaitinfo\fP() function selects the pending signal from the +set specified by \fIset\fP. Should any of multiple +pending signals in the range SIGRTMIN to SIGRTMAX be selected, it +shall be the lowest numbered one. The selection order between +realtime and non-realtime signals, or between multiple pending non-realtime +signals, is unspecified. If no signal in \fIset\fP is +pending at the time of the call, the calling thread shall be suspended +until one or more signals in \fIset\fP become pending or +until it is interrupted by an unblocked, caught signal. +.LP +The \fIsigwaitinfo\fP() function shall be equivalent to the \fIsigwait\fP() +function +if the \fIinfo\fP argument is NULL. If the \fIinfo\fP argument is +non-NULL, the \fIsigwaitinfo\fP() function shall be equivalent +to \fIsigwait\fP(), except that the selected signal number shall be +stored in the +\fIsi_signo\fP member, and the cause of the signal shall be stored +in the \fIsi_code\fP member. If any value is queued to the +selected signal, the first such queued value shall be dequeued and, +if the \fIinfo\fP argument is non-NULL, the value shall be +stored in the \fIsi_value\fP member of \fIinfo\fP. The system resource +used to queue the signal shall be released and returned to +the system for other use. If no value is queued, the content of the +\fIsi_value\fP member is undefined. If no further signals are +queued for the selected signal, the pending indication for that signal +shall be reset. +.SH RETURN VALUE +.LP +Upon successful completion (that is, one of the signals specified +by \fIset\fP is pending or is generated) \fIsigwaitinfo\fP() +and \fIsigtimedwait\fP() shall return the selected signal number. +Otherwise, the function shall return a value of -1 and set +\fIerrno\fP to indicate the error. +.SH ERRORS +.LP +The \fIsigtimedwait\fP() function shall fail if: +.TP 7 +.B EAGAIN +No signal specified by \fIset\fP was generated within the specified +timeout period. +.sp +.LP +The \fIsigtimedwait\fP() and \fIsigwaitinfo\fP() functions may fail +if: +.TP 7 +.B EINTR +The wait was interrupted by an unblocked, caught signal. It shall +be documented in system documentation whether this error +causes these functions to fail. +.sp +.LP +The \fIsigtimedwait\fP() function may also fail if: +.TP 7 +.B EINVAL +The \fItimeout\fP argument specified a \fItv_nsec\fP value less than +zero or greater than or equal to 1000 million. +.sp +.LP +An implementation only checks for this error if no signal is pending +in \fIset\fP and it is necessary to wait. +.LP +\fIThe following sections are informative.\fP +.SH EXAMPLES +.LP +None. +.SH APPLICATION USAGE +.LP +The \fIsigtimedwait\fP() function times out and returns an [EAGAIN] +error. Application writers should note that this is +inconsistent with other functions such as \fIpthread_cond_timedwait\fP() +that return [ETIMEDOUT]. +.SH RATIONALE +.LP +Existing programming practice on realtime systems uses the ability +to pause waiting for a selected set of events and handle the +first event that occurs in-line instead of in a signal-handling function. +This allows applications to be written in an +event-directed style similar to a state machine. This style of programming +is useful for largescale transaction processing in which +the overall throughput of an application and the ability to clearly +track states are more important than the ability to minimize +the response time of individual event handling. +.LP +It is possible to construct a signal-waiting macro function out of +the realtime signal function mechanism defined in this volume +of IEEE\ Std\ 1003.1-2001. However, such a macro has to include the +definition of a generalized handler for all signals to +be waited on. A significant portion of the overhead of handler processing +can be avoided if the signal-waiting function is provided +by the kernel. This volume of IEEE\ Std\ 1003.1-2001 therefore provides +two signal-waiting functions-one that waits +indefinitely and one with a timeout-as part of the overall realtime +signal function specification. +.LP +The specification of a function with a timeout allows an application +to be written that can be broken out of a wait after a set +period of time if no event has occurred. It was argued that setting +a timer event before the wait and recognizing the timer event +in the wait would also implement the same functionality, but at a +lower performance level. Because of the performance degradation +associated with the user-level specification of a timer event and +the subsequent cancellation of that timer event after the wait +completes for a valid event, and the complexity associated with handling +potential race conditions associated with the user-level +method, the separate function has been included. +.LP +Note that the semantics of the \fIsigwaitinfo\fP() function are nearly +identical to that of the \fIsigwait\fP() function defined by this +volume of IEEE\ Std\ 1003.1-2001. The only +difference is that \fIsigwaitinfo\fP() returns the queued signal value +in the \fIvalue\fP argument. The return of the queued +value is required so that applications can differentiate between multiple +events queued to the same signal number. +.LP +The two distinct functions are being maintained because some implementations +may choose to implement the POSIX Threads Extension +functions and not implement the queued signals extensions. Note, though, +that \fIsigwaitinfo\fP() does not return the queued value +if the \fIvalue\fP argument is NULL, so the POSIX Threads Extension +\fIsigwait\fP() +function can be implemented as a macro on \fIsigwaitinfo\fP(). +.LP +The \fIsigtimedwait\fP() function was separated from the \fIsigwaitinfo\fP() +function to address concerns regarding the +overloading of the \fItimeout\fP pointer to indicate indefinite wait +(no timeout), timed wait, and immediate return, and concerns +regarding consistency with other functions where the conditional and +timed waits were separate functions from the pure blocking +function. The semantics of \fIsigtimedwait\fP() are specified such +that \fIsigwaitinfo\fP() could be implemented as a macro with +a NULL pointer for \fItimeout\fP. +.LP +The \fIsigwait\fP functions provide a synchronous mechanism for threads +to wait for asynchronously-generated signals. One +important question was how many threads that are suspended in a call +to a \fIsigwait\fP() +function for a signal should return from the call when the signal +is sent. Four choices were considered: +.IP " 1." 4 +Return an error for multiple simultaneous calls to \fIsigwait\fP functions +for the same signal. +.LP +.IP " 2." 4 +One or more threads return. +.LP +.IP " 3." 4 +All waiting threads return. +.LP +.IP " 4." 4 +Exactly one thread returns. +.LP +.LP +Prohibiting multiple calls to \fIsigwait\fP() for the same signal +was felt to be overly +restrictive. The "one or more" behavior made implementation of conforming +packages easy at the expense of forcing POSIX threads +clients to protect against multiple simultaneous calls to \fIsigwait\fP() +in application +code in order to achieve predictable behavior. There was concern that +the "all waiting threads" behavior would result in "signal +broadcast storms", consuming excessive CPU resources by replicating +the signals in the general case. Furthermore, no convincing +examples could be presented that delivery to all was either simpler +or more powerful than delivery to one. +.LP +Thus, the consensus was that exactly one thread that was suspended +in a call to a \fIsigwait\fP function for a signal should +return when that signal occurs. This is not an onerous restriction +as: +.IP " *" 3 +A multi-way signal wait can be built from the single-way wait. +.LP +.IP " *" 3 +Signals should only be handled by application-level code, as library +routines cannot guess what the application wants to do with +signals generated for the entire process. +.LP +.IP " *" 3 +Applications can thus arrange for a single thread to wait for any +given signal and call any needed routines upon its +arrival. +.LP +.LP +In an application that is using signals for interprocess communication, +signal processing is typically done in one place. +Alternatively, if the signal is being caught so that process cleanup +can be done, the signal handler thread can call separate +process cleanup routines for each portion of the application. Since +the application main line started each portion of the +application, it is at the right abstraction level to tell each portion +of the application to clean up. +.LP +Certainly, there exist programming styles where it is logical to consider +waiting for a single signal in multiple threads. A +simple \fIsigwait_multiple\fP() routine can be constructed to achieve +this goal. A possible implementation would be to have each +\fIsigwait_multiple\fP() caller registered as having expressed interest +in a set of signals. The caller then waits on a +thread-specific condition variable. A single server thread calls a +\fIsigwait\fP() +function on the union of all registered signals. When the \fIsigwait\fP() +function +returns, the appropriate state is set and condition variables are +broadcast. New \fIsigwait_multiple\fP() callers may cause the +pending \fIsigwait\fP() call to be canceled and reissued in order +to update the set of +signals being waited for. +.SH FUTURE DIRECTIONS +.LP +None. +.SH SEE ALSO +.LP +\fIRealtime Signals\fP , \fIpause\fP() , \fIpthread_sigmask\fP() , +\fIsigaction\fP() , \fIsigpending\fP() , \fIsigsuspend\fP() , \fIsigwait\fP() +, the Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<signal.h>\fP, +\fI<time.h>\fP +.SH COPYRIGHT +Portions of this text are reprinted and reproduced in electronic form +from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology +-- Portable Operating System Interface (POSIX), The Open Group Base +Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of +Electrical and Electronics Engineers, Inc and The Open Group. In the +event of any discrepancy between this version and the original IEEE and +The Open Group Standard, the original IEEE and The Open Group Standard +is the referee document. The original Standard can be obtained online at +http://www.opengroup.org/unix/online.html . |