aboutsummaryrefslogtreecommitdiff
path: root/src/lib/bsdsignal.c.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/lib/bsdsignal.c.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/lib/bsdsignal.c.pamphlet')
-rw-r--r--src/lib/bsdsignal.c.pamphlet320
1 files changed, 320 insertions, 0 deletions
diff --git a/src/lib/bsdsignal.c.pamphlet b/src/lib/bsdsignal.c.pamphlet
new file mode 100644
index 00000000..5807659b
--- /dev/null
+++ b/src/lib/bsdsignal.c.pamphlet
@@ -0,0 +1,320 @@
+\documentclass{article}
+\usepackage{axiom}
+
+\newcommand{\var}[1]{\textsl{#1}}
+
+\title{\File{src/lib/bsdsignal.c} Pamphlet}
+\author{The Axiom Team}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+\end{abstract}
+\eject
+
+\tableofcontents
+\newpage
+
+\section{Executive Overview}
+
+\section{Signals}
+
+The system defines a set of signals that may be delivered to a process.
+Signal
+delivery resembles the occurrence of a hardware interrupt: the signal is
+normally blocked from further occurrence, the current process context is
+saved,
+and a new one is built. A process may specify a \emph{handler} to
+which a signal
+is delivered, or specify that a signal is to be \emph{ignored}. A process may
+also specify that a default action is to be taken by the system when a signal
+occurs. A signal may also be \emph{blocked}, in which case its delivery is
+postponed until it is \emph{unblocked}. The action to be taken on delivery is
+determined at the time of delivery. Normally, signal handlers execute on the
+current stack of the process. This may be changed, on a per-handler basis, so
+that signals are taken on a special \emph{signal stack}.
+
+Signal routines normally execute with the signal that caused their invocation
+\emph{blocked}, but other signals may yet occur. A global \emph{signal mask}
+defines the set of signals currently blocked from delivery to a process.
+The signal mask for a process is initialized from that of its parent
+(normally empty). It may be changed with a \emph{[[sigprocmask]](2)} call, or
+when a signal is delivered to the process.
+
+When a signal condition arises for a process, the signal is added to a set of
+signals pending for the process. If the signal is not currently \emph{blocked}
+by the process then it is delivered to the process. Signals may be delivered
+any time a process enters the operating system (e.g., during a system call,
+page fault or trap, or clock interrupt). If muliple signals are ready to be
+delivered at the same time, any signals that could be caused by traps are
+delivered first. Additional signals may be processed at the same time, with
+each appearing to interrupt the handlers for the previous signals before
+their first instructions. The set of pending signals is retuned by the
+\emph{[[sigpending]](2)} system call. When a caught signal is delivered,
+the current
+state of the process is saved, a new signal mask is calculated (as described
+below), and the signal handler is invoked. The call to the handler is arranged
+so that if the signal handling routine returns normally the process will resume
+execution in the context from before the signal's delivery. If the process
+wishes to resume in a different context, then it must arrange to restore
+the previous context itself.
+
+When a signal is delivered to a proces a new signal mask is installed for the
+duration of the process's signal handler (or until a \emph{[[sigprocmask]](2)}
+system call is made). This mask is formed by taking the union of the current
+signal mask set, the signal to be delivered, and the signal mask associated
+with the handler to be invoked.
+
+The \emph{[[sigaction]]()} system call assigns an action for a signal
+specified by \var{sig}. If \var{act} is non-zero, it specifies an action
+([[SIG_DFL]], [[SIG_IGN]], or a handler routine) and mask to be used when
+delivering the specified signal.
+If \var{oact} is non-zero, the previous handling information for the signal is
+returned to the user.
+
+Once a signal handler is installed, it normally remains installed until
+another
+[[sigaction()]] system call is made, or an \emph{[[execve]](2)} is performed.
+A
+signal-specific default action may be reset by setting [[sa_handler]] to
+[[SIG_DFL]]. The defaults are process termination, possibly with core dump;
+no action; stopping the process; or continuing the process. See the signal
+list below for each signal's default action. If [[sa_handler]] is [[SIG_DFL]],
+the default action for the signal is to discard the signal, and if a signal
+is pending, the pending signal is discarded even if the signal is masked. If
+[[sa_handler]] is set to [[SIG_IGN]] current and pending instances of the
+signal
+are ignored and discarded.
+
+Options may be specified by setting [[sa_flags]]. The meaning of the various
+bits is as follows:
+\begin{tabular}{ll}
+SA\_NOCLDSTOP & If this bit is set when installing a catching function for\\
+ & the SIGCHLD signal, the SIGCHLD signal will be generated only\\
+ & when a child process exits, not when a child process stops.\\
+SA\_NOCLDWAIT & If this bit is set when calling {\sl sigaction()} for the\\
+ & SIGCHLD signal, the system will not create zombie processes\\
+ & when children of the calling process exit. If the calling\\
+ & process subsequently issues a {\sf wait()} (or equivalent),\\
+ & it blocks until all of the calling process's child processes\\
+ & terminate, and then returns a value of -1 with errno set to\\
+ & ECHILD.\\
+SA\_ONSTACK & If this bit is set, the system will deliver the signal to\\
+ & the process on a {\sl signal stack}, specified with\\
+ & {\bf sigaltstack(2)}.\\
+SA\_NODEFER & If this bit is set, further occurrences of the delivered\\
+ & signal are not masked during the execution of the handler.\\
+SA\_RESETHAND & If this bit is set, the handler is reset back to SIG\_DFL\\
+ & at the moment the signal is delivered.\\
+SA\_RESTART & See the paragraph below\\
+SA\_SIGINFO & If this bit is set, the handler function is assumed to be\\
+ & pointed to by the sa\_sigaction member of struct sigaction\\
+ & and should match the prototype shown above or as below in\\
+ & EXAMPLES. This bit should not be set when assigning SIG\_DFL\\
+ & or SIG\_IGN
+\end{tabular}
+
+If a signal is caught during the system calls listed below, the call may be
+forced to terminate with the error [[EINTR]], the call may return with a data
+transfer shorter than requested, or the call may be restarted. Restart of
+pending calls is requested by setting the SA\_RESTART bit in {\sl sa\_flags}.
+The affected system calls include {\bf open(2)}, {\bf read(2)}, {\bf write(2)},
+{\bf sendto(2)}, {\bf recvfrom(2)}, {\bf sendmsg(2)} and {\bf recvmsg(2)}
+on a communications channel or a slow device (such as a terminal, but not a
+regular file) and during a {\bf wait(2)} or {\bf ioctl(2)}. However, calls
+that have already committed are not restarted, but instead return a partial
+success (for example, a short read count).
+
+After a {\bf fork(2)} or {\bf vfork(2)} all signals, the signal mask, the
+signal stack, and the restart/interrupt flags are inherited by the child.
+
+The {\bf execve(2)} system call reinstates the default action for all signals
+which were caught and resets all signals to be caught on the user stack.
+Ignored signals remain ignored; the signal mask remains the same; signals
+that restart pending system calls continue to do so.
+
+The following is a list of all signals with names as in the include file
+{\sl <signal.h>}:
+
+\begin{tabular}{lll}
+{\bf NAME} & {\bf Default Action} & Description\\
+SIGHUP & terminate process & terminal line hangup\\
+SIGINT & terminate process & interrupt program\\
+SIGQUIT & create core image & quit program\\
+SIGILL & create core image & illegal instruction\\
+SIGTRAP & create core image & trace trap\\
+SIGABRT & create core image & {\bf abort(3)} call (formerly SIGIOT)\\
+SIGEMT & create core image & emulate instruction executed\\
+SIGFPE & create core image & floating-point exception\\
+SIGKILL & terminate process & kill program\\
+SIGBUS & create core image & bus error\\
+SIGSEGV & create core image & segmentation violation\\
+SIGSYS & create core image & non-existent system call invoked\\
+SIGPIPE & terminate process & write on a pipe with no reader\\
+SIGALRM & terminate process & real-time timer expired\\
+SIGTERM & terminate process & software termination signal\\
+SIGURG & discard signal & urgent condition present on socket\\
+SIGSTOP & stop process & stop (cannot be caught or ignored)\\
+SIGSTP & stop process & stop signal generated from keyboard\\
+SIGCONT & discard signal & continue after stop\\
+SIGCHLD & discard signal & child status has changed\\
+SIGTTIN & stop process & background read attempted from \\
+ & & control terminal\\
+SIGTTOU & stop process & background write attempted from\\
+ & & control terminal\\
+SIGIO & discard signal & I/O is possible on a descriptor {\bf fcntl(2)}\\
+SIGXCPU & terminate process & cpu time limit exceeded {\bf setrlimit(2)}\\
+SIGXFSZ & terminate process & file size limit exceeded {\bf setrlimit(2)}\\
+SIGVTALRM & terminate process & virtual time alarm {\bf setitimer(2)}\\
+SIGPROF & terminate process & profiling timer alarm {\bf setitimer(2)}\\
+SIGWINCH & discard signal & Window size change\\
+SIGINFO & discard signal & status request from keyboard\\
+SIGUSR1 & terminate process & User defined signal 1\\
+SIGUSR2 & terminate process & User defined signal 2
+\end{tabular}
+
+The {\sl sigaction()} function returns the value 0 if successful; otherwise
+the value -1 is returned and the global variable {\sl errno} is set to indicate
+the error.
+
+Signal handlers should have either the ANSI C prototype:
+\begin{verbatim}
+ void handler(int);
+\end{verbatim}
+or the POSIX SA\_SIGINFO prototype:
+\begin{verbatim}
+ void handler(int, siginfo\_t *info, ucontext\_t *uap);
+\end{verbatim}
+
+The handler function should match the SA\_SIGINFO prototype if the SA\_SIGINFO
+bit is set in flags. It then should be pointed to by the sa\_sigaction member
+of struct sigaction. Note that you should not assign SIG\_DFL or SIG\_IGN this way.
+
+If the SA\_SIGINFO flag is not set, the handler function should match either
+the ANSI C or traditional BSD prototype and be pointed to by the sa\_handler
+member of struct sigaction. In practice, FreeBSD always sends the three
+arguments of the latter and since the ANSI C prototype is a subset, both
+will work. The sa\_handler member declaration in FreeBSD include files is
+that of ANSI C (as required by POSIX), so a function pointer of a BSD-style
+function needs to be casted to compile without warning. The traditional BSD
+style is not portable and since its capabilities are a full subset of a
+SA\_SIGNFO handler its use is deprecated.
+
+The {\sl sig} argument is the signal number, one of the SIG\ldots values from
+{\sl <signal.h>}.
+
+The {\sl code} argument of the BSD-style handler and the si\_code member of the
+info argument to a SA\_SIGINFO handler contain a numeric code explaining the
+cause of the signal, usually on of the SI\_\ldots values from {\sl <sys/signal.h>}
+or codes specific to a signal, i.e. one of the FPE\_\ldots values for SIGFPE.
+
+The {\sl uap} argument to a POSIX SA\_SIGINFO handler points to an instance of
+ucontext\_t.
+
+The {\bf sigaction()} system call will fail and no new signal handler will be
+installed if one of the following occurs:
+\begin{tabular}{ll}
+EFAULT & Either {\sl act} or {\sl oact} points to memory that is not a\\
+ & valid part of the process address space\\
+EINVAL & The {\sl sig} argument is not a valid signal number\\
+EINVAL & An attempt is made to ignore or supply a handler for SIGKILL\\
+ & or SIGSTOP
+\end{tabular}
+\section{MAC OSX and BSD platform change}
+<<*>>=
+<<license>>
+
+#include "axiom-c-macros.h"
+#include "bsdsignal.h"
+
+@
+The MACOSX platform is broken because no matter what you do it seems to
+include files from [[/usr/include/sys]] ahead of [[/usr/include]]. On linux
+systems these files include themselves which causes an infinite regression
+of includes that fails. GCC gracefully steps over that problem but the
+build fails anyway. On MACOSX the [[/usr/include/sys]] versions
+of files are badly broken with respect to the [[/usr/include]] versions.
+<<*>>=
+#if defined(MACOSXplatform)
+#include "/usr/include/signal.h"
+#else
+#include <signal.h>
+#endif
+
+#include "bsdsignal.H1"
+
+
+SignalHandlerFunc
+bsdSignal(int sig, SignalHandlerFunc action, int restartSystemCall)
+{
+#if HAVE_DECL_SIGACTION
+
+ struct sigaction in,out;
+ in.sa_handler = action;
+ /* handler is reinstalled - calls are restarted if restartSystemCall */
+@
+
+We needed to change [[SIGCLD]] to [[SIGCHLD]] for the [[MAC OSX]] platform
+and we need to create a new platform variable. This change is made to
+propogate that platform variable.
+<<*>>=
+#ifdef SA_RESTART
+ if(restartSystemCall) in.sa_flags = SA_RESTART;
+ else in.sa_flags = 0;
+#elif defined(SA_INTERRUPT)
+ if (restartSystemCall) in.sa_flags = 0;
+ else in.sa_flags = SA_INTERRUPT;
+#else
+ in.sa_flags = 0;
+#endif
+
+ return (sigaction(sig, &in, &out) ? (SignalHandlerFunc) -1 :
+ (SignalHandlerFunc) out.sa_handler);
+#else /* !HAVE_DECL_SIGACTION */
+ return (SignalHandlerFunc) -1;
+#endif /* HAVE_DECL_SIGACTION */
+}
+
+
+@
+\section{License}
+<<license>>=
+/*
+Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+@
+\newpage
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}