|  | @node Signal Handling, Program Basics, Non-Local Exits, Top | 
|  | @c %MENU% How to send, block, and handle signals | 
|  | @chapter Signal Handling | 
|  |  | 
|  | @cindex signal | 
|  | A @dfn{signal} is a software interrupt delivered to a process.  The | 
|  | operating system uses signals to report exceptional situations to an | 
|  | executing program.  Some signals report errors such as references to | 
|  | invalid memory addresses; others report asynchronous events, such as | 
|  | disconnection of a phone line. | 
|  |  | 
|  | @Theglibc{} defines a variety of signal types, each for a | 
|  | particular kind of event.  Some kinds of events make it inadvisable or | 
|  | impossible for the program to proceed as usual, and the corresponding | 
|  | signals normally abort the program.  Other kinds of signals that report | 
|  | harmless events are ignored by default. | 
|  |  | 
|  | If you anticipate an event that causes signals, you can define a handler | 
|  | function and tell the operating system to run it when that particular | 
|  | type of signal arrives. | 
|  |  | 
|  | Finally, one process can send a signal to another process; this allows a | 
|  | parent process to abort a child, or two related processes to communicate | 
|  | and synchronize. | 
|  |  | 
|  | @menu | 
|  | * Concepts of Signals::         Introduction to the signal facilities. | 
|  | * Standard Signals::            Particular kinds of signals with | 
|  | standard names and meanings. | 
|  | * Signal Actions::              Specifying what happens when a | 
|  | particular signal is delivered. | 
|  | * Defining Handlers::           How to write a signal handler function. | 
|  | * Interrupted Primitives::	Signal handlers affect use of @code{open}, | 
|  | @code{read}, @code{write} and other functions. | 
|  | * Generating Signals::          How to send a signal to a process. | 
|  | * Blocking Signals::            Making the system hold signals temporarily. | 
|  | * Waiting for a Signal::        Suspending your program until a signal | 
|  | arrives. | 
|  | * Signal Stack::                Using a Separate Signal Stack. | 
|  | * BSD Signal Handling::         Additional functions for backward | 
|  | compatibility with BSD. | 
|  | @end menu | 
|  |  | 
|  | @node Concepts of Signals | 
|  | @section Basic Concepts of Signals | 
|  |  | 
|  | This section explains basic concepts of how signals are generated, what | 
|  | happens after a signal is delivered, and how programs can handle | 
|  | signals. | 
|  |  | 
|  | @menu | 
|  | * Kinds of Signals::            Some examples of what can cause a signal. | 
|  | * Signal Generation::           Concepts of why and how signals occur. | 
|  | * Delivery of Signal::          Concepts of what a signal does to the | 
|  | process. | 
|  | @end menu | 
|  |  | 
|  | @node Kinds of Signals | 
|  | @subsection Some Kinds of Signals | 
|  |  | 
|  | A signal reports the occurrence of an exceptional event.  These are some | 
|  | of the events that can cause (or @dfn{generate}, or @dfn{raise}) a | 
|  | signal: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | A program error such as dividing by zero or issuing an address outside | 
|  | the valid range. | 
|  |  | 
|  | @item | 
|  | A user request to interrupt or terminate the program.  Most environments | 
|  | are set up to let a user suspend the program by typing @kbd{C-z}, or | 
|  | terminate it with @kbd{C-c}.  Whatever key sequence is used, the | 
|  | operating system sends the proper signal to interrupt the process. | 
|  |  | 
|  | @item | 
|  | The termination of a child process. | 
|  |  | 
|  | @item | 
|  | Expiration of a timer or alarm. | 
|  |  | 
|  | @item | 
|  | A call to @code{kill} or @code{raise} by the same process. | 
|  |  | 
|  | @item | 
|  | A call to @code{kill} from another process.  Signals are a limited but | 
|  | useful form of interprocess communication. | 
|  |  | 
|  | @item | 
|  | An attempt to perform an I/O operation that cannot be done.  Examples | 
|  | are reading from a pipe that has no writer (@pxref{Pipes and FIFOs}), | 
|  | and reading or writing to a terminal in certain situations (@pxref{Job | 
|  | Control}). | 
|  | @end itemize | 
|  |  | 
|  | Each of these kinds of events (excepting explicit calls to @code{kill} | 
|  | and @code{raise}) generates its own particular kind of signal.  The | 
|  | various kinds of signals are listed and described in detail in | 
|  | @ref{Standard Signals}. | 
|  |  | 
|  | @node Signal Generation | 
|  | @subsection Concepts of Signal Generation | 
|  | @cindex generation of signals | 
|  |  | 
|  | In general, the events that generate signals fall into three major | 
|  | categories: errors, external events, and explicit requests. | 
|  |  | 
|  | An error means that a program has done something invalid and cannot | 
|  | continue execution.  But not all kinds of errors generate signals---in | 
|  | fact, most do not.  For example, opening a nonexistent file is an error, | 
|  | but it does not raise a signal; instead, @code{open} returns @code{-1}. | 
|  | In general, errors that are necessarily associated with certain library | 
|  | functions are reported by returning a value that indicates an error. | 
|  | The errors which raise signals are those which can happen anywhere in | 
|  | the program, not just in library calls.  These include division by zero | 
|  | and invalid memory addresses. | 
|  |  | 
|  | An external event generally has to do with I/O or other processes. | 
|  | These include the arrival of input, the expiration of a timer, and the | 
|  | termination of a child process. | 
|  |  | 
|  | An explicit request means the use of a library function such as | 
|  | @code{kill} whose purpose is specifically to generate a signal. | 
|  |  | 
|  | Signals may be generated @dfn{synchronously} or @dfn{asynchronously}.  A | 
|  | synchronous signal pertains to a specific action in the program, and is | 
|  | delivered (unless blocked) during that action.  Most errors generate | 
|  | signals synchronously, and so do explicit requests by a process to | 
|  | generate a signal for that same process.  On some machines, certain | 
|  | kinds of hardware errors (usually floating-point exceptions) are not | 
|  | reported completely synchronously, but may arrive a few instructions | 
|  | later. | 
|  |  | 
|  | Asynchronous signals are generated by events outside the control of the | 
|  | process that receives them.  These signals arrive at unpredictable times | 
|  | during execution.  External events generate signals asynchronously, and | 
|  | so do explicit requests that apply to some other process. | 
|  |  | 
|  | A given type of signal is either typically synchronous or typically | 
|  | asynchronous.  For example, signals for errors are typically synchronous | 
|  | because errors generate signals synchronously.  But any type of signal | 
|  | can be generated synchronously or asynchronously with an explicit | 
|  | request. | 
|  |  | 
|  | @node Delivery of Signal | 
|  | @subsection How Signals Are Delivered | 
|  | @cindex delivery of signals | 
|  | @cindex pending signals | 
|  | @cindex blocked signals | 
|  |  | 
|  | When a signal is generated, it becomes @dfn{pending}.  Normally it | 
|  | remains pending for just a short period of time and then is | 
|  | @dfn{delivered} to the process that was signaled.  However, if that kind | 
|  | of signal is currently @dfn{blocked}, it may remain pending | 
|  | indefinitely---until signals of that kind are @dfn{unblocked}.  Once | 
|  | unblocked, it will be delivered immediately.  @xref{Blocking Signals}. | 
|  |  | 
|  | @cindex specified action (for a signal) | 
|  | @cindex default action (for a signal) | 
|  | @cindex signal action | 
|  | @cindex catching signals | 
|  | When the signal is delivered, whether right away or after a long delay, | 
|  | the @dfn{specified action} for that signal is taken.  For certain | 
|  | signals, such as @code{SIGKILL} and @code{SIGSTOP}, the action is fixed, | 
|  | but for most signals, the program has a choice: ignore the signal, | 
|  | specify a @dfn{handler function}, or accept the @dfn{default action} for | 
|  | that kind of signal.  The program specifies its choice using functions | 
|  | such as @code{signal} or @code{sigaction} (@pxref{Signal Actions}).  We | 
|  | sometimes say that a handler @dfn{catches} the signal.  While the | 
|  | handler is running, that particular signal is normally blocked. | 
|  |  | 
|  | If the specified action for a kind of signal is to ignore it, then any | 
|  | such signal which is generated is discarded immediately.  This happens | 
|  | even if the signal is also blocked at the time.  A signal discarded in | 
|  | this way will never be delivered, not even if the program subsequently | 
|  | specifies a different action for that kind of signal and then unblocks | 
|  | it. | 
|  |  | 
|  | If a signal arrives which the program has neither handled nor ignored, | 
|  | its @dfn{default action} takes place.  Each kind of signal has its own | 
|  | default action, documented below (@pxref{Standard Signals}).  For most kinds | 
|  | of signals, the default action is to terminate the process.  For certain | 
|  | kinds of signals that represent ``harmless'' events, the default action | 
|  | is to do nothing. | 
|  |  | 
|  | When a signal terminates a process, its parent process can determine the | 
|  | cause of termination by examining the termination status code reported | 
|  | by the @code{wait} or @code{waitpid} functions.  (This is discussed in | 
|  | more detail in @ref{Process Completion}.)  The information it can get | 
|  | includes the fact that termination was due to a signal and the kind of | 
|  | signal involved.  If a program you run from a shell is terminated by a | 
|  | signal, the shell typically prints some kind of error message. | 
|  |  | 
|  | The signals that normally represent program errors have a special | 
|  | property: when one of these signals terminates the process, it also | 
|  | writes a @dfn{core dump file} which records the state of the process at | 
|  | the time of termination.  You can examine the core dump with a debugger | 
|  | to investigate what caused the error. | 
|  |  | 
|  | If you raise a ``program error'' signal by explicit request, and this | 
|  | terminates the process, it makes a core dump file just as if the signal | 
|  | had been due directly to an error. | 
|  |  | 
|  | @node Standard Signals | 
|  | @section Standard Signals | 
|  | @cindex signal names | 
|  | @cindex names of signals | 
|  |  | 
|  | @pindex signal.h | 
|  | @cindex signal number | 
|  | This section lists the names for various standard kinds of signals and | 
|  | describes what kind of event they mean.  Each signal name is a macro | 
|  | which stands for a positive integer---the @dfn{signal number} for that | 
|  | kind of signal.  Your programs should never make assumptions about the | 
|  | numeric code for a particular kind of signal, but rather refer to them | 
|  | always by the names defined here.  This is because the number for a | 
|  | given kind of signal can vary from system to system, but the meanings of | 
|  | the names are standardized and fairly uniform. | 
|  |  | 
|  | The signal names are defined in the header file @file{signal.h}. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int NSIG | 
|  | The value of this symbolic constant is the total number of signals | 
|  | defined.  Since the signal numbers are allocated consecutively, | 
|  | @code{NSIG} is also one greater than the largest defined signal number. | 
|  | @end deftypevr | 
|  |  | 
|  | @menu | 
|  | * Program Error Signals::       Used to report serious program errors. | 
|  | * Termination Signals::         Used to interrupt and/or terminate the | 
|  | program. | 
|  | * Alarm Signals::               Used to indicate expiration of timers. | 
|  | * Asynchronous I/O Signals::    Used to indicate input is available. | 
|  | * Job Control Signals::         Signals used to support job control. | 
|  | * Operation Error Signals::     Used to report operational system errors. | 
|  | * Miscellaneous Signals::       Miscellaneous Signals. | 
|  | * Signal Messages::             Printing a message describing a signal. | 
|  | @end menu | 
|  |  | 
|  | @node Program Error Signals | 
|  | @subsection Program Error Signals | 
|  | @cindex program error signals | 
|  |  | 
|  | The following signals are generated when a serious program error is | 
|  | detected by the operating system or the computer itself.  In general, | 
|  | all of these signals are indications that your program is seriously | 
|  | broken in some way, and there's usually no way to continue the | 
|  | computation which encountered the error. | 
|  |  | 
|  | Some programs handle program error signals in order to tidy up before | 
|  | terminating; for example, programs that turn off echoing of terminal | 
|  | input should handle program error signals in order to turn echoing back | 
|  | on.  The handler should end by specifying the default action for the | 
|  | signal that happened and then reraising it; this will cause the program | 
|  | to terminate with that signal, as if it had not had a handler. | 
|  | (@xref{Termination in Handler}.) | 
|  |  | 
|  | Termination is the sensible ultimate outcome from a program error in | 
|  | most programs.  However, programming systems such as Lisp that can load | 
|  | compiled user programs might need to keep executing even if a user | 
|  | program incurs an error.  These programs have handlers which use | 
|  | @code{longjmp} to return control to the command level. | 
|  |  | 
|  | The default action for all of these signals is to cause the process to | 
|  | terminate.  If you block or ignore these signals or establish handlers | 
|  | for them that return normally, your program will probably break horribly | 
|  | when such signals happen, unless they are generated by @code{raise} or | 
|  | @code{kill} instead of a real error. | 
|  |  | 
|  | @vindex COREFILE | 
|  | When one of these program error signals terminates a process, it also | 
|  | writes a @dfn{core dump file} which records the state of the process at | 
|  | the time of termination.  The core dump file is named @file{core} and is | 
|  | written in whichever directory is current in the process at the time. | 
|  | (On @gnuhurdsystems{}, you can specify the file name for core dumps with | 
|  | the environment variable @code{COREFILE}.)  The purpose of core dump | 
|  | files is so that you can examine them with a debugger to investigate | 
|  | what caused the error. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGFPE | 
|  | The @code{SIGFPE} signal reports a fatal arithmetic error.  Although the | 
|  | name is derived from ``floating-point exception'', this signal actually | 
|  | covers all arithmetic errors, including division by zero and overflow. | 
|  | If a program stores integer data in a location which is then used in a | 
|  | floating-point operation, this often causes an ``invalid operation'' | 
|  | exception, because the processor cannot recognize the data as a | 
|  | floating-point number. | 
|  | @cindex exception | 
|  | @cindex floating-point exception | 
|  |  | 
|  | Actual floating-point exceptions are a complicated subject because there | 
|  | are many types of exceptions with subtly different meanings, and the | 
|  | @code{SIGFPE} signal doesn't distinguish between them.  The @cite{IEEE | 
|  | Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 | 
|  | and ANSI/IEEE Std 854-1987)} | 
|  | defines various floating-point exceptions and requires conforming | 
|  | computer systems to report their occurrences.  However, this standard | 
|  | does not specify how the exceptions are reported, or what kinds of | 
|  | handling and control the operating system can offer to the programmer. | 
|  | @end deftypevr | 
|  |  | 
|  | BSD systems provide the @code{SIGFPE} handler with an extra argument | 
|  | that distinguishes various causes of the exception.  In order to access | 
|  | this argument, you must define the handler to accept two arguments, | 
|  | which means you must cast it to a one-argument function type in order to | 
|  | establish the handler.  @Theglibc{} does provide this extra | 
|  | argument, but the value is meaningful only on operating systems that | 
|  | provide the information (BSD systems and @gnusystems{}). | 
|  |  | 
|  | @table @code | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_INTOVF_TRAP | 
|  | @vindex FPE_INTOVF_TRAP | 
|  | Integer overflow (impossible in a C program unless you enable overflow | 
|  | trapping in a hardware-specific fashion). | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_INTDIV_TRAP | 
|  | @vindex FPE_INTDIV_TRAP | 
|  | Integer division by zero. | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_SUBRNG_TRAP | 
|  | @vindex FPE_SUBRNG_TRAP | 
|  | Subscript-range (something that C programs never check for). | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTOVF_TRAP | 
|  | @vindex FPE_FLTOVF_TRAP | 
|  | Floating overflow trap. | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTDIV_TRAP | 
|  | @vindex FPE_FLTDIV_TRAP | 
|  | Floating/decimal division by zero. | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTUND_TRAP | 
|  | @vindex FPE_FLTUND_TRAP | 
|  | Floating underflow trap.  (Trapping on floating underflow is not | 
|  | normally enabled.) | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_DECOVF_TRAP | 
|  | @vindex FPE_DECOVF_TRAP | 
|  | Decimal overflow trap.  (Only a few machines have decimal arithmetic and | 
|  | C never uses it.) | 
|  | @ignore @c These seem redundant | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTOVF_FAULT | 
|  | @vindex FPE_FLTOVF_FAULT | 
|  | Floating overflow fault. | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTDIV_FAULT | 
|  | @vindex FPE_FLTDIV_FAULT | 
|  | Floating divide by zero fault. | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @item FPE_FLTUND_FAULT | 
|  | @vindex FPE_FLTUND_FAULT | 
|  | Floating underflow fault. | 
|  | @end ignore | 
|  | @end table | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGILL | 
|  | The name of this signal is derived from ``illegal instruction''; it | 
|  | usually means your program is trying to execute garbage or a privileged | 
|  | instruction.  Since the C compiler generates only valid instructions, | 
|  | @code{SIGILL} typically indicates that the executable file is corrupted, | 
|  | or that you are trying to execute data.  Some common ways of getting | 
|  | into the latter situation are by passing an invalid object where a | 
|  | pointer to a function was expected, or by writing past the end of an | 
|  | automatic array (or similar problems with pointers to automatic | 
|  | variables) and corrupting other data on the stack such as the return | 
|  | address of a stack frame. | 
|  |  | 
|  | @code{SIGILL} can also be generated when the stack overflows, or when | 
|  | the system has trouble running the handler for a signal. | 
|  | @end deftypevr | 
|  | @cindex illegal instruction | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGSEGV | 
|  | @cindex segmentation violation | 
|  | This signal is generated when a program tries to read or write outside | 
|  | the memory that is allocated for it, or to write memory that can only be | 
|  | read.  (Actually, the signals only occur when the program goes far | 
|  | enough outside to be detected by the system's memory protection | 
|  | mechanism.)  The name is an abbreviation for ``segmentation violation''. | 
|  |  | 
|  | Common ways of getting a @code{SIGSEGV} condition include dereferencing | 
|  | a null or uninitialized pointer, or when you use a pointer to step | 
|  | through an array, but fail to check for the end of the array.  It varies | 
|  | among systems whether dereferencing a null pointer generates | 
|  | @code{SIGSEGV} or @code{SIGBUS}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGBUS | 
|  | This signal is generated when an invalid pointer is dereferenced.  Like | 
|  | @code{SIGSEGV}, this signal is typically the result of dereferencing an | 
|  | uninitialized pointer.  The difference between the two is that | 
|  | @code{SIGSEGV} indicates an invalid access to valid memory, while | 
|  | @code{SIGBUS} indicates an access to an invalid address.  In particular, | 
|  | @code{SIGBUS} signals often result from dereferencing a misaligned | 
|  | pointer, such as referring to a four-word integer at an address not | 
|  | divisible by four.  (Each kind of computer has its own requirements for | 
|  | address alignment.) | 
|  |  | 
|  | The name of this signal is an abbreviation for ``bus error''. | 
|  | @end deftypevr | 
|  | @cindex bus error | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGABRT | 
|  | @cindex abort signal | 
|  | This signal indicates an error detected by the program itself and | 
|  | reported by calling @code{abort}.  @xref{Aborting a Program}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment Unix | 
|  | @deftypevr Macro int SIGIOT | 
|  | Generated by the PDP-11 ``iot'' instruction.  On most machines, this is | 
|  | just another name for @code{SIGABRT}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGTRAP | 
|  | Generated by the machine's breakpoint instruction, and possibly other | 
|  | trap instructions.  This signal is used by debuggers.  Your program will | 
|  | probably only see @code{SIGTRAP} if it is somehow executing bad | 
|  | instructions. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int  SIGEMT | 
|  | Emulator trap; this results from certain unimplemented instructions | 
|  | which might be emulated in software, or the operating system's | 
|  | failure to properly emulate them. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment Unix | 
|  | @deftypevr Macro int  SIGSYS | 
|  | Bad system call; that is to say, the instruction to trap to the | 
|  | operating system was executed, but the code number for the system call | 
|  | to perform was invalid. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Termination Signals | 
|  | @subsection Termination Signals | 
|  | @cindex program termination signals | 
|  |  | 
|  | These signals are all used to tell a process to terminate, in one way | 
|  | or another.  They have different names because they're used for slightly | 
|  | different purposes, and programs might want to handle them differently. | 
|  |  | 
|  | The reason for handling these signals is usually so your program can | 
|  | tidy up as appropriate before actually terminating.  For example, you | 
|  | might want to save state information, delete temporary files, or restore | 
|  | the previous terminal modes.  Such a handler should end by specifying | 
|  | the default action for the signal that happened and then reraising it; | 
|  | this will cause the program to terminate with that signal, as if it had | 
|  | not had a handler.  (@xref{Termination in Handler}.) | 
|  |  | 
|  | The (obvious) default action for all of these signals is to cause the | 
|  | process to terminate. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGTERM | 
|  | @cindex termination signal | 
|  | The @code{SIGTERM} signal is a generic signal used to cause program | 
|  | termination.  Unlike @code{SIGKILL}, this signal can be blocked, | 
|  | handled, and ignored.  It is the normal way to politely ask a program to | 
|  | terminate. | 
|  |  | 
|  | The shell command @code{kill} generates @code{SIGTERM} by default. | 
|  | @pindex kill | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int SIGINT | 
|  | @cindex interrupt signal | 
|  | The @code{SIGINT} (``program interrupt'') signal is sent when the user | 
|  | types the INTR character (normally @kbd{C-c}).  @xref{Special | 
|  | Characters}, for information about terminal driver support for | 
|  | @kbd{C-c}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGQUIT | 
|  | @cindex quit signal | 
|  | @cindex quit signal | 
|  | The @code{SIGQUIT} signal is similar to @code{SIGINT}, except that it's | 
|  | controlled by a different key---the QUIT character, usually | 
|  | @kbd{C-\}---and produces a core dump when it terminates the process, | 
|  | just like a program error signal.  You can think of this as a | 
|  | program error condition ``detected'' by the user. | 
|  |  | 
|  | @xref{Program Error Signals}, for information about core dumps. | 
|  | @xref{Special Characters}, for information about terminal driver | 
|  | support. | 
|  |  | 
|  | Certain kinds of cleanups are best omitted in handling @code{SIGQUIT}. | 
|  | For example, if the program creates temporary files, it should handle | 
|  | the other termination requests by deleting the temporary files.  But it | 
|  | is better for @code{SIGQUIT} not to delete them, so that the user can | 
|  | examine them in conjunction with the core dump. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGKILL | 
|  | The @code{SIGKILL} signal is used to cause immediate program termination. | 
|  | It cannot be handled or ignored, and is therefore always fatal.  It is | 
|  | also not possible to block this signal. | 
|  |  | 
|  | This signal is usually generated only by explicit request.  Since it | 
|  | cannot be handled, you should generate it only as a last resort, after | 
|  | first trying a less drastic method such as @kbd{C-c} or @code{SIGTERM}. | 
|  | If a process does not respond to any other termination signals, sending | 
|  | it a @code{SIGKILL} signal will almost always cause it to go away. | 
|  |  | 
|  | In fact, if @code{SIGKILL} fails to terminate a process, that by itself | 
|  | constitutes an operating system bug which you should report. | 
|  |  | 
|  | The system will generate @code{SIGKILL} for a process itself under some | 
|  | unusual conditions where the program cannot possibly continue to run | 
|  | (even to run a signal handler). | 
|  | @end deftypevr | 
|  | @cindex kill signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGHUP | 
|  | @cindex hangup signal | 
|  | The @code{SIGHUP} (``hang-up'') signal is used to report that the user's | 
|  | terminal is disconnected, perhaps because a network or telephone | 
|  | connection was broken.  For more information about this, see @ref{Control | 
|  | Modes}. | 
|  |  | 
|  | This signal is also used to report the termination of the controlling | 
|  | process on a terminal to jobs associated with that session; this | 
|  | termination effectively disconnects all processes in the session from | 
|  | the controlling terminal.  For more information, see @ref{Termination | 
|  | Internals}. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Alarm Signals | 
|  | @subsection Alarm Signals | 
|  |  | 
|  | These signals are used to indicate the expiration of timers. | 
|  | @xref{Setting an Alarm}, for information about functions that cause | 
|  | these signals to be sent. | 
|  |  | 
|  | The default behavior for these signals is to cause program termination. | 
|  | This default is rarely useful, but no other default would be useful; | 
|  | most of the ways of using these signals would require handler functions | 
|  | in any case. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGALRM | 
|  | This signal typically indicates expiration of a timer that measures real | 
|  | or clock time.  It is used by the @code{alarm} function, for example. | 
|  | @end deftypevr | 
|  | @cindex alarm signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGVTALRM | 
|  | This signal typically indicates expiration of a timer that measures CPU | 
|  | time used by the current process.  The name is an abbreviation for | 
|  | ``virtual time alarm''. | 
|  | @end deftypevr | 
|  | @cindex virtual time alarm signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGPROF | 
|  | This signal typically indicates expiration of a timer that measures | 
|  | both CPU time used by the current process, and CPU time expended on | 
|  | behalf of the process by the system.  Such a timer is used to implement | 
|  | code profiling facilities, hence the name of this signal. | 
|  | @end deftypevr | 
|  | @cindex profiling alarm signal | 
|  |  | 
|  |  | 
|  | @node Asynchronous I/O Signals | 
|  | @subsection Asynchronous I/O Signals | 
|  |  | 
|  | The signals listed in this section are used in conjunction with | 
|  | asynchronous I/O facilities.  You have to take explicit action by | 
|  | calling @code{fcntl} to enable a particular file descriptor to generate | 
|  | these signals (@pxref{Interrupt Input}).  The default action for these | 
|  | signals is to ignore them. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGIO | 
|  | @cindex input available signal | 
|  | @cindex output possible signal | 
|  | This signal is sent when a file descriptor is ready to perform input | 
|  | or output. | 
|  |  | 
|  | On most operating systems, terminals and sockets are the only kinds of | 
|  | files that can generate @code{SIGIO}; other kinds, including ordinary | 
|  | files, never generate @code{SIGIO} even if you ask them to. | 
|  |  | 
|  | On @gnusystems{} @code{SIGIO} will always be generated properly | 
|  | if you successfully set asynchronous mode with @code{fcntl}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGURG | 
|  | @cindex urgent data signal | 
|  | This signal is sent when ``urgent'' or out-of-band data arrives on a | 
|  | socket.  @xref{Out-of-Band Data}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment SVID | 
|  | @deftypevr Macro int SIGPOLL | 
|  | This is a System V signal name, more or less similar to @code{SIGIO}. | 
|  | It is defined only for compatibility. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Job Control Signals | 
|  | @subsection Job Control Signals | 
|  | @cindex job control signals | 
|  |  | 
|  | These signals are used to support job control.  If your system | 
|  | doesn't support job control, then these macros are defined but the | 
|  | signals themselves can't be raised or handled. | 
|  |  | 
|  | You should generally leave these signals alone unless you really | 
|  | understand how job control works.  @xref{Job Control}. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGCHLD | 
|  | @cindex child process signal | 
|  | This signal is sent to a parent process whenever one of its child | 
|  | processes terminates or stops. | 
|  |  | 
|  | The default action for this signal is to ignore it.  If you establish a | 
|  | handler for this signal while there are child processes that have | 
|  | terminated but not reported their status via @code{wait} or | 
|  | @code{waitpid} (@pxref{Process Completion}), whether your new handler | 
|  | applies to those processes or not depends on the particular operating | 
|  | system. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment SVID | 
|  | @deftypevr Macro int SIGCLD | 
|  | This is an obsolete name for @code{SIGCHLD}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGCONT | 
|  | @cindex continue signal | 
|  | You can send a @code{SIGCONT} signal to a process to make it continue. | 
|  | This signal is special---it always makes the process continue if it is | 
|  | stopped, before the signal is delivered.  The default behavior is to do | 
|  | nothing else.  You cannot block this signal.  You can set a handler, but | 
|  | @code{SIGCONT} always makes the process continue regardless. | 
|  |  | 
|  | Most programs have no reason to handle @code{SIGCONT}; they simply | 
|  | resume execution without realizing they were ever stopped.  You can use | 
|  | a handler for @code{SIGCONT} to make a program do something special when | 
|  | it is stopped and continued---for example, to reprint a prompt when it | 
|  | is suspended while waiting for input. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGSTOP | 
|  | The @code{SIGSTOP} signal stops the process.  It cannot be handled, | 
|  | ignored, or blocked. | 
|  | @end deftypevr | 
|  | @cindex stop signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGTSTP | 
|  | The @code{SIGTSTP} signal is an interactive stop signal.  Unlike | 
|  | @code{SIGSTOP}, this signal can be handled and ignored. | 
|  |  | 
|  | Your program should handle this signal if you have a special need to | 
|  | leave files or system tables in a secure state when a process is | 
|  | stopped.  For example, programs that turn off echoing should handle | 
|  | @code{SIGTSTP} so they can turn echoing back on before stopping. | 
|  |  | 
|  | This signal is generated when the user types the SUSP character | 
|  | (normally @kbd{C-z}).  For more information about terminal driver | 
|  | support, see @ref{Special Characters}. | 
|  | @end deftypevr | 
|  | @cindex interactive stop signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGTTIN | 
|  | A process cannot read from the user's terminal while it is running | 
|  | as a background job.  When any process in a background job tries to | 
|  | read from the terminal, all of the processes in the job are sent a | 
|  | @code{SIGTTIN} signal.  The default action for this signal is to | 
|  | stop the process.  For more information about how this interacts with | 
|  | the terminal driver, see @ref{Access to the Terminal}. | 
|  | @end deftypevr | 
|  | @cindex terminal input signal | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGTTOU | 
|  | This is similar to @code{SIGTTIN}, but is generated when a process in a | 
|  | background job attempts to write to the terminal or set its modes. | 
|  | Again, the default action is to stop the process.  @code{SIGTTOU} is | 
|  | only generated for an attempt to write to the terminal if the | 
|  | @code{TOSTOP} output mode is set; @pxref{Output Modes}. | 
|  | @end deftypevr | 
|  | @cindex terminal output signal | 
|  |  | 
|  | While a process is stopped, no more signals can be delivered to it until | 
|  | it is continued, except @code{SIGKILL} signals and (obviously) | 
|  | @code{SIGCONT} signals.  The signals are marked as pending, but not | 
|  | delivered until the process is continued.  The @code{SIGKILL} signal | 
|  | always causes termination of the process and can't be blocked, handled | 
|  | or ignored.  You can ignore @code{SIGCONT}, but it always causes the | 
|  | process to be continued anyway if it is stopped.  Sending a | 
|  | @code{SIGCONT} signal to a process causes any pending stop signals for | 
|  | that process to be discarded.  Likewise, any pending @code{SIGCONT} | 
|  | signals for a process are discarded when it receives a stop signal. | 
|  |  | 
|  | When a process in an orphaned process group (@pxref{Orphaned Process | 
|  | Groups}) receives a @code{SIGTSTP}, @code{SIGTTIN}, or @code{SIGTTOU} | 
|  | signal and does not handle it, the process does not stop.  Stopping the | 
|  | process would probably not be very useful, since there is no shell | 
|  | program that will notice it stop and allow the user to continue it. | 
|  | What happens instead depends on the operating system you are using. | 
|  | Some systems may do nothing; others may deliver another signal instead, | 
|  | such as @code{SIGKILL} or @code{SIGHUP}.  On @gnuhurdsystems{}, the process | 
|  | dies with @code{SIGKILL}; this avoids the problem of many stopped, | 
|  | orphaned processes lying around the system. | 
|  |  | 
|  | @ignore | 
|  | On @gnuhurdsystems{}, it is possible to reattach to the orphaned process | 
|  | group and continue it, so stop signals do stop the process as usual on | 
|  | @gnuhurdsystems{} unless you have requested POSIX compatibility ``till it | 
|  | hurts.'' | 
|  | @end ignore | 
|  |  | 
|  | @node Operation Error Signals | 
|  | @subsection Operation Error Signals | 
|  |  | 
|  | These signals are used to report various errors generated by an | 
|  | operation done by the program.  They do not necessarily indicate a | 
|  | programming error in the program, but an error that prevents an | 
|  | operating system call from completing.  The default action for all of | 
|  | them is to cause the process to terminate. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGPIPE | 
|  | @cindex pipe signal | 
|  | @cindex broken pipe signal | 
|  | Broken pipe.  If you use pipes or FIFOs, you have to design your | 
|  | application so that one process opens the pipe for reading before | 
|  | another starts writing.  If the reading process never starts, or | 
|  | terminates unexpectedly, writing to the pipe or FIFO raises a | 
|  | @code{SIGPIPE} signal.  If @code{SIGPIPE} is blocked, handled or | 
|  | ignored, the offending call fails with @code{EPIPE} instead. | 
|  |  | 
|  | Pipes and FIFO special files are discussed in more detail in @ref{Pipes | 
|  | and FIFOs}. | 
|  |  | 
|  | Another cause of @code{SIGPIPE} is when you try to output to a socket | 
|  | that isn't connected.  @xref{Sending Data}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment GNU | 
|  | @deftypevr Macro int SIGLOST | 
|  | @cindex lost resource signal | 
|  | Resource lost.  This signal is generated when you have an advisory lock | 
|  | on an NFS file, and the NFS server reboots and forgets about your lock. | 
|  |  | 
|  | On @gnuhurdsystems{}, @code{SIGLOST} is generated when any server program | 
|  | dies unexpectedly.  It is usually fine to ignore the signal; whatever | 
|  | call was made to the server that died just returns an error. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGXCPU | 
|  | CPU time limit exceeded.  This signal is generated when the process | 
|  | exceeds its soft resource limit on CPU time.  @xref{Limits on Resources}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGXFSZ | 
|  | File size limit exceeded.  This signal is generated when the process | 
|  | attempts to extend a file so it exceeds the process's soft resource | 
|  | limit on file size.  @xref{Limits on Resources}. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Miscellaneous Signals | 
|  | @subsection Miscellaneous Signals | 
|  |  | 
|  | These signals are used for various other purposes.  In general, they | 
|  | will not affect your program unless it explicitly uses them for something. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SIGUSR1 | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevrx Macro int SIGUSR2 | 
|  | @cindex user signals | 
|  | The @code{SIGUSR1} and @code{SIGUSR2} signals are set aside for you to | 
|  | use any way you want.  They're useful for simple interprocess | 
|  | communication, if you write a signal handler for them in the program | 
|  | that receives the signal. | 
|  |  | 
|  | There is an example showing the use of @code{SIGUSR1} and @code{SIGUSR2} | 
|  | in @ref{Signaling Another Process}. | 
|  |  | 
|  | The default action is to terminate the process. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGWINCH | 
|  | Window size change.  This is generated on some systems (including GNU) | 
|  | when the terminal driver's record of the number of rows and columns on | 
|  | the screen is changed.  The default action is to ignore it. | 
|  |  | 
|  | If a program does full-screen display, it should handle @code{SIGWINCH}. | 
|  | When the signal arrives, it should fetch the new screen size and | 
|  | reformat its display accordingly. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SIGINFO | 
|  | Information request.  On 4.4 BSD and @gnuhurdsystems{}, this signal is sent | 
|  | to all the processes in the foreground process group of the controlling | 
|  | terminal when the user types the STATUS character in canonical mode; | 
|  | @pxref{Signal Characters}. | 
|  |  | 
|  | If the process is the leader of the process group, the default action is | 
|  | to print some status information about the system and what the process | 
|  | is doing.  Otherwise the default is to do nothing. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Signal Messages | 
|  | @subsection Signal Messages | 
|  | @cindex signal messages | 
|  |  | 
|  | We mentioned above that the shell prints a message describing the signal | 
|  | that terminated a child process.  The clean way to print a message | 
|  | describing a signal is to use the functions @code{strsignal} and | 
|  | @code{psignal}.  These functions use a signal number to specify which | 
|  | kind of signal to describe.  The signal number may come from the | 
|  | termination status of a child process (@pxref{Process Completion}) or it | 
|  | may come from a signal handler in the same process. | 
|  |  | 
|  | @comment string.h | 
|  | @comment GNU | 
|  | @deftypefun {char *} strsignal (int @var{signum}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:strsignal} @mtslocale{}}@asunsafe{@asuinit{} @ascuintl{} @asucorrupt{} @ascuheap{}}@acunsafe{@acuinit{} @acucorrupt{} @acsmem{}}} | 
|  | @c strsignal @mtasurace:strsignal @mtslocale @asuinit @ascuintl @asucorrupt @ascuheap @acucorrupt @acsmem | 
|  | @c   uses a static buffer if tsd key creation fails | 
|  | @c  [once] init | 
|  | @c   libc_key_create ok | 
|  | @c    pthread_key_create dup ok | 
|  | @c  getbuffer @asucorrupt @ascuheap @acsmem | 
|  | @c   libc_getspecific ok | 
|  | @c    pthread_getspecific dup ok | 
|  | @c   malloc dup @ascuheap @acsmem | 
|  | @c   libc_setspecific @asucorrupt @ascuheap @acucorrupt @acsmem | 
|  | @c    pthread_setspecific dup @asucorrupt @ascuheap @acucorrupt @acsmem | 
|  | @c  snprintf dup @mtslocale @ascuheap @acsmem | 
|  | @c  _ @ascuintl | 
|  | This function returns a pointer to a statically-allocated string | 
|  | containing a message describing the signal @var{signum}.  You | 
|  | should not modify the contents of this string; and, since it can be | 
|  | rewritten on subsequent calls, you should save a copy of it if you need | 
|  | to reference it later. | 
|  |  | 
|  | @pindex string.h | 
|  | This function is a GNU extension, declared in the header file | 
|  | @file{string.h}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun void psignal (int @var{signum}, const char *@var{message}) | 
|  | @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuintl{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}} | 
|  | @c psignal @mtslocale @asucorrupt @ascuintl @ascuheap @aculock @acucorrupt @acsmem | 
|  | @c  _ @ascuintl | 
|  | @c  fxprintf @asucorrupt @aculock @acucorrupt | 
|  | @c  asprintf @mtslocale @ascuheap @acsmem | 
|  | @c  free dup @ascuheap @acsmem | 
|  | This function prints a message describing the signal @var{signum} to the | 
|  | standard error output stream @code{stderr}; see @ref{Standard Streams}. | 
|  |  | 
|  | If you call @code{psignal} with a @var{message} that is either a null | 
|  | pointer or an empty string, @code{psignal} just prints the message | 
|  | corresponding to @var{signum}, adding a trailing newline. | 
|  |  | 
|  | If you supply a non-null @var{message} argument, then @code{psignal} | 
|  | prefixes its output with this string.  It adds a colon and a space | 
|  | character to separate the @var{message} from the string corresponding | 
|  | to @var{signum}. | 
|  |  | 
|  | @pindex stdio.h | 
|  | This function is a BSD feature, declared in the header file @file{signal.h}. | 
|  | @end deftypefun | 
|  |  | 
|  | @vindex sys_siglist | 
|  | There is also an array @code{sys_siglist} which contains the messages | 
|  | for the various signal codes.  This array exists on BSD systems, unlike | 
|  | @code{strsignal}. | 
|  |  | 
|  | @node Signal Actions | 
|  | @section Specifying Signal Actions | 
|  | @cindex signal actions | 
|  | @cindex establishing a handler | 
|  |  | 
|  | The simplest way to change the action for a signal is to use the | 
|  | @code{signal} function.  You can specify a built-in action (such as to | 
|  | ignore the signal), or you can @dfn{establish a handler}. | 
|  |  | 
|  | @Theglibc{} also implements the more versatile @code{sigaction} | 
|  | facility.  This section describes both facilities and gives suggestions | 
|  | on which to use when. | 
|  |  | 
|  | @menu | 
|  | * Basic Signal Handling::       The simple @code{signal} function. | 
|  | * Advanced Signal Handling::    The more powerful @code{sigaction} function. | 
|  | * Signal and Sigaction::        How those two functions interact. | 
|  | * Sigaction Function Example::  An example of using the sigaction function. | 
|  | * Flags for Sigaction::         Specifying options for signal handling. | 
|  | * Initial Signal Actions::      How programs inherit signal actions. | 
|  | @end menu | 
|  |  | 
|  | @node Basic Signal Handling | 
|  | @subsection Basic Signal Handling | 
|  | @cindex @code{signal} function | 
|  |  | 
|  | The @code{signal} function provides a simple interface for establishing | 
|  | an action for a particular signal.  The function and associated macros | 
|  | are declared in the header file @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment GNU | 
|  | @deftp {Data Type} sighandler_t | 
|  | This is the type of signal handler functions.  Signal handlers take one | 
|  | integer argument specifying the signal number, and have return type | 
|  | @code{void}.  So, you should define handler functions like this: | 
|  |  | 
|  | @smallexample | 
|  | void @var{handler} (int @code{signum}) @{ @dots{} @} | 
|  | @end smallexample | 
|  |  | 
|  | The name @code{sighandler_t} for this data type is a GNU extension. | 
|  | @end deftp | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypefun sighandler_t signal (int @var{signum}, sighandler_t @var{action}) | 
|  | @safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}} | 
|  | @c signal ok | 
|  | @c  sigemptyset dup ok | 
|  | @c  sigaddset dup ok | 
|  | @c  sigismember dup ok | 
|  | @c  sigaction dup ok | 
|  | The @code{signal} function establishes @var{action} as the action for | 
|  | the signal @var{signum}. | 
|  |  | 
|  | The first argument, @var{signum}, identifies the signal whose behavior | 
|  | you want to control, and should be a signal number.  The proper way to | 
|  | specify a signal number is with one of the symbolic signal names | 
|  | (@pxref{Standard Signals})---don't use an explicit number, because | 
|  | the numerical code for a given kind of signal may vary from operating | 
|  | system to operating system. | 
|  |  | 
|  | The second argument, @var{action}, specifies the action to use for the | 
|  | signal @var{signum}.  This can be one of the following: | 
|  |  | 
|  | @table @code | 
|  | @item SIG_DFL | 
|  | @vindex SIG_DFL | 
|  | @cindex default action for a signal | 
|  | @code{SIG_DFL} specifies the default action for the particular signal. | 
|  | The default actions for various kinds of signals are stated in | 
|  | @ref{Standard Signals}. | 
|  |  | 
|  | @item SIG_IGN | 
|  | @vindex SIG_IGN | 
|  | @cindex ignore action for a signal | 
|  | @code{SIG_IGN} specifies that the signal should be ignored. | 
|  |  | 
|  | Your program generally should not ignore signals that represent serious | 
|  | events or that are normally used to request termination.  You cannot | 
|  | ignore the @code{SIGKILL} or @code{SIGSTOP} signals at all.  You can | 
|  | ignore program error signals like @code{SIGSEGV}, but ignoring the error | 
|  | won't enable the program to continue executing meaningfully.  Ignoring | 
|  | user requests such as @code{SIGINT}, @code{SIGQUIT}, and @code{SIGTSTP} | 
|  | is unfriendly. | 
|  |  | 
|  | When you do not wish signals to be delivered during a certain part of | 
|  | the program, the thing to do is to block them, not ignore them. | 
|  | @xref{Blocking Signals}. | 
|  |  | 
|  | @item @var{handler} | 
|  | Supply the address of a handler function in your program, to specify | 
|  | running this handler as the way to deliver the signal. | 
|  |  | 
|  | For more information about defining signal handler functions, | 
|  | see @ref{Defining Handlers}. | 
|  | @end table | 
|  |  | 
|  | If you set the action for a signal to @code{SIG_IGN}, or if you set it | 
|  | to @code{SIG_DFL} and the default action is to ignore that signal, then | 
|  | any pending signals of that type are discarded (even if they are | 
|  | blocked).  Discarding the pending signals means that they will never be | 
|  | delivered, not even if you subsequently specify another action and | 
|  | unblock this kind of signal. | 
|  |  | 
|  | The @code{signal} function returns the action that was previously in | 
|  | effect for the specified @var{signum}.  You can save this value and | 
|  | restore it later by calling @code{signal} again. | 
|  |  | 
|  | If @code{signal} can't honor the request, it returns @code{SIG_ERR} | 
|  | instead.  The following @code{errno} error conditions are defined for | 
|  | this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | You specified an invalid @var{signum}; or you tried to ignore or provide | 
|  | a handler for @code{SIGKILL} or @code{SIGSTOP}. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @strong{Compatibility Note:} A problem encountered when working with the | 
|  | @code{signal} function is that it has different semantics on BSD and | 
|  | SVID systems.  The difference is that on SVID systems the signal handler | 
|  | is deinstalled after signal delivery.  On BSD systems the | 
|  | handler must be explicitly deinstalled.  In @theglibc{} we use the | 
|  | BSD version by default.  To use the SVID version you can either use the | 
|  | function @code{sysv_signal} (see below) or use the @code{_XOPEN_SOURCE} | 
|  | feature select macro (@pxref{Feature Test Macros}).  In general, use of these | 
|  | functions should be avoided because of compatibility problems.  It | 
|  | is better to use @code{sigaction} if it is available since the results | 
|  | are much more reliable. | 
|  |  | 
|  | Here is a simple example of setting up a handler to delete temporary | 
|  | files when certain fatal signals happen: | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  |  | 
|  | void | 
|  | termination_handler (int signum) | 
|  | @{ | 
|  | struct temp_file *p; | 
|  |  | 
|  | for (p = temp_file_list; p; p = p->next) | 
|  | unlink (p->name); | 
|  | @} | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | @dots{} | 
|  | if (signal (SIGINT, termination_handler) == SIG_IGN) | 
|  | signal (SIGINT, SIG_IGN); | 
|  | if (signal (SIGHUP, termination_handler) == SIG_IGN) | 
|  | signal (SIGHUP, SIG_IGN); | 
|  | if (signal (SIGTERM, termination_handler) == SIG_IGN) | 
|  | signal (SIGTERM, SIG_IGN); | 
|  | @dots{} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | @noindent | 
|  | Note that if a given signal was previously set to be ignored, this code | 
|  | avoids altering that setting.  This is because non-job-control shells | 
|  | often ignore certain signals when starting children, and it is important | 
|  | for the children to respect this. | 
|  |  | 
|  | We do not handle @code{SIGQUIT} or the program error signals in this | 
|  | example because these are designed to provide information for debugging | 
|  | (a core dump), and the temporary files may give useful information. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment GNU | 
|  | @deftypefun sighandler_t sysv_signal (int @var{signum}, sighandler_t @var{action}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c sysv_signal ok | 
|  | @c  sigemptyset dup ok | 
|  | @c  sigaction dup ok | 
|  | The @code{sysv_signal} implements the behavior of the standard | 
|  | @code{signal} function as found on SVID systems.  The difference to BSD | 
|  | systems is that the handler is deinstalled after a delivery of a signal. | 
|  |  | 
|  | @strong{Compatibility Note:} As said above for @code{signal}, this | 
|  | function should be avoided when possible.  @code{sigaction} is the | 
|  | preferred method. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment SVID | 
|  | @deftypefun sighandler_t ssignal (int @var{signum}, sighandler_t @var{action}) | 
|  | @safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}} | 
|  | @c Aliases signal and bsd_signal. | 
|  | The @code{ssignal} function does the same thing as @code{signal}; it is | 
|  | provided only for compatibility with SVID. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypevr Macro sighandler_t SIG_ERR | 
|  | The value of this macro is used as the return value from @code{signal} | 
|  | to indicate an error. | 
|  | @end deftypevr | 
|  |  | 
|  | @ignore | 
|  | @comment RMS says that ``we don't do this''. | 
|  | Implementations might define additional macros for built-in signal | 
|  | actions that are suitable as a @var{action} argument to @code{signal}, | 
|  | besides @code{SIG_IGN} and @code{SIG_DFL}.  Identifiers whose names | 
|  | begin with @samp{SIG_} followed by an uppercase letter are reserved for | 
|  | this purpose. | 
|  | @end ignore | 
|  |  | 
|  |  | 
|  | @node Advanced Signal Handling | 
|  | @subsection Advanced Signal Handling | 
|  | @cindex @code{sigaction} function | 
|  |  | 
|  | The @code{sigaction} function has the same basic effect as | 
|  | @code{signal}: to specify how a signal should be handled by the process. | 
|  | However, @code{sigaction} offers more control, at the expense of more | 
|  | complexity.  In particular, @code{sigaction} allows you to specify | 
|  | additional flags to control when the signal is generated and how the | 
|  | handler is invoked. | 
|  |  | 
|  | The @code{sigaction} function is declared in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftp {Data Type} {struct sigaction} | 
|  | Structures of type @code{struct sigaction} are used in the | 
|  | @code{sigaction} function to specify all the information about how to | 
|  | handle a particular signal.  This structure contains at least the | 
|  | following members: | 
|  |  | 
|  | @table @code | 
|  | @item sighandler_t sa_handler | 
|  | This is used in the same way as the @var{action} argument to the | 
|  | @code{signal} function.  The value can be @code{SIG_DFL}, | 
|  | @code{SIG_IGN}, or a function pointer.  @xref{Basic Signal Handling}. | 
|  |  | 
|  | @item sigset_t sa_mask | 
|  | This specifies a set of signals to be blocked while the handler runs. | 
|  | Blocking is explained in @ref{Blocking for Handler}.  Note that the | 
|  | signal that was delivered is automatically blocked by default before its | 
|  | handler is started; this is true regardless of the value in | 
|  | @code{sa_mask}.  If you want that signal not to be blocked within its | 
|  | handler, you must write code in the handler to unblock it. | 
|  |  | 
|  | @item int sa_flags | 
|  | This specifies various flags which can affect the behavior of | 
|  | the signal.  These are described in more detail in @ref{Flags for Sigaction}. | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigaction (int @var{signum}, const struct sigaction *restrict @var{action}, struct sigaction *restrict @var{old-action}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | The @var{action} argument is used to set up a new action for the signal | 
|  | @var{signum}, while the @var{old-action} argument is used to return | 
|  | information about the action previously associated with this symbol. | 
|  | (In other words, @var{old-action} has the same purpose as the | 
|  | @code{signal} function's return value---you can check to see what the | 
|  | old action in effect for the signal was, and restore it later if you | 
|  | want.) | 
|  |  | 
|  | Either @var{action} or @var{old-action} can be a null pointer.  If | 
|  | @var{old-action} is a null pointer, this simply suppresses the return | 
|  | of information about the old action.  If @var{action} is a null pointer, | 
|  | the action associated with the signal @var{signum} is unchanged; this | 
|  | allows you to inquire about how a signal is being handled without changing | 
|  | that handling. | 
|  |  | 
|  | The return value from @code{sigaction} is zero if it succeeds, and | 
|  | @code{-1} on failure.  The following @code{errno} error conditions are | 
|  | defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The @var{signum} argument is not valid, or you are trying to | 
|  | trap or ignore @code{SIGKILL} or @code{SIGSTOP}. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @node Signal and Sigaction | 
|  | @subsection Interaction of @code{signal} and @code{sigaction} | 
|  |  | 
|  | It's possible to use both the @code{signal} and @code{sigaction} | 
|  | functions within a single program, but you have to be careful because | 
|  | they can interact in slightly strange ways. | 
|  |  | 
|  | The @code{sigaction} function specifies more information than the | 
|  | @code{signal} function, so the return value from @code{signal} cannot | 
|  | express the full range of @code{sigaction} possibilities.  Therefore, if | 
|  | you use @code{signal} to save and later reestablish an action, it may | 
|  | not be able to reestablish properly a handler that was established with | 
|  | @code{sigaction}. | 
|  |  | 
|  | To avoid having problems as a result, always use @code{sigaction} to | 
|  | save and restore a handler if your program uses @code{sigaction} at all. | 
|  | Since @code{sigaction} is more general, it can properly save and | 
|  | reestablish any action, regardless of whether it was established | 
|  | originally with @code{signal} or @code{sigaction}. | 
|  |  | 
|  | On some systems if you establish an action with @code{signal} and then | 
|  | examine it with @code{sigaction}, the handler address that you get may | 
|  | not be the same as what you specified with @code{signal}.  It may not | 
|  | even be suitable for use as an action argument with @code{signal}.  But | 
|  | you can rely on using it as an argument to @code{sigaction}.  This | 
|  | problem never happens on @gnusystems{}. | 
|  |  | 
|  | So, you're better off using one or the other of the mechanisms | 
|  | consistently within a single program. | 
|  |  | 
|  | @strong{Portability Note:} The basic @code{signal} function is a feature | 
|  | of @w{ISO C}, while @code{sigaction} is part of the POSIX.1 standard.  If | 
|  | you are concerned about portability to non-POSIX systems, then you | 
|  | should use the @code{signal} function instead. | 
|  |  | 
|  | @node Sigaction Function Example | 
|  | @subsection @code{sigaction} Function Example | 
|  |  | 
|  | In @ref{Basic Signal Handling}, we gave an example of establishing a | 
|  | simple handler for termination signals using @code{signal}.  Here is an | 
|  | equivalent example using @code{sigaction}: | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  |  | 
|  | void | 
|  | termination_handler (int signum) | 
|  | @{ | 
|  | struct temp_file *p; | 
|  |  | 
|  | for (p = temp_file_list; p; p = p->next) | 
|  | unlink (p->name); | 
|  | @} | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | @dots{} | 
|  | struct sigaction new_action, old_action; | 
|  |  | 
|  | /* @r{Set up the structure to specify the new action.} */ | 
|  | new_action.sa_handler = termination_handler; | 
|  | sigemptyset (&new_action.sa_mask); | 
|  | new_action.sa_flags = 0; | 
|  |  | 
|  | sigaction (SIGINT, NULL, &old_action); | 
|  | if (old_action.sa_handler != SIG_IGN) | 
|  | sigaction (SIGINT, &new_action, NULL); | 
|  | sigaction (SIGHUP, NULL, &old_action); | 
|  | if (old_action.sa_handler != SIG_IGN) | 
|  | sigaction (SIGHUP, &new_action, NULL); | 
|  | sigaction (SIGTERM, NULL, &old_action); | 
|  | if (old_action.sa_handler != SIG_IGN) | 
|  | sigaction (SIGTERM, &new_action, NULL); | 
|  | @dots{} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | The program just loads the @code{new_action} structure with the desired | 
|  | parameters and passes it in the @code{sigaction} call.  The usage of | 
|  | @code{sigemptyset} is described later; see @ref{Blocking Signals}. | 
|  |  | 
|  | As in the example using @code{signal}, we avoid handling signals | 
|  | previously set to be ignored.  Here we can avoid altering the signal | 
|  | handler even momentarily, by using the feature of @code{sigaction} that | 
|  | lets us examine the current action without specifying a new one. | 
|  |  | 
|  | Here is another example.  It retrieves information about the current | 
|  | action for @code{SIGINT} without changing that action. | 
|  |  | 
|  | @smallexample | 
|  | struct sigaction query_action; | 
|  |  | 
|  | if (sigaction (SIGINT, NULL, &query_action) < 0) | 
|  | /* @r{@code{sigaction} returns -1 in case of error.} */ | 
|  | else if (query_action.sa_handler == SIG_DFL) | 
|  | /* @r{@code{SIGINT} is handled in the default, fatal manner.} */ | 
|  | else if (query_action.sa_handler == SIG_IGN) | 
|  | /* @r{@code{SIGINT} is ignored.} */ | 
|  | else | 
|  | /* @r{A programmer-defined signal handler is in effect.} */ | 
|  | @end smallexample | 
|  |  | 
|  | @node Flags for Sigaction | 
|  | @subsection Flags for @code{sigaction} | 
|  | @cindex signal flags | 
|  | @cindex flags for @code{sigaction} | 
|  | @cindex @code{sigaction} flags | 
|  |  | 
|  | The @code{sa_flags} member of the @code{sigaction} structure is a | 
|  | catch-all for special features.  Most of the time, @code{SA_RESTART} is | 
|  | a good value to use for this field. | 
|  |  | 
|  | The value of @code{sa_flags} is interpreted as a bit mask.  Thus, you | 
|  | should choose the flags you want to set, @sc{or} those flags together, | 
|  | and store the result in the @code{sa_flags} member of your | 
|  | @code{sigaction} structure. | 
|  |  | 
|  | Each signal number has its own set of flags.  Each call to | 
|  | @code{sigaction} affects one particular signal number, and the flags | 
|  | that you specify apply only to that particular signal. | 
|  |  | 
|  | In @theglibc{}, establishing a handler with @code{signal} sets all | 
|  | the flags to zero except for @code{SA_RESTART}, whose value depends on | 
|  | the settings you have made with @code{siginterrupt}.  @xref{Interrupted | 
|  | Primitives}, to see what this is about. | 
|  |  | 
|  | @pindex signal.h | 
|  | These macros are defined in the header file @file{signal.h}. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int SA_NOCLDSTOP | 
|  | This flag is meaningful only for the @code{SIGCHLD} signal.  When the | 
|  | flag is set, the system delivers the signal for a terminated child | 
|  | process but not for one that is stopped.  By default, @code{SIGCHLD} is | 
|  | delivered for both terminated children and stopped children. | 
|  |  | 
|  | Setting this flag for a signal other than @code{SIGCHLD} has no effect. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SA_ONSTACK | 
|  | If this flag is set for a particular signal number, the system uses the | 
|  | signal stack when delivering that kind of signal.  @xref{Signal Stack}. | 
|  | If a signal with this flag arrives and you have not set a signal stack, | 
|  | the system terminates the program with @code{SIGILL}. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypevr Macro int SA_RESTART | 
|  | This flag controls what happens when a signal is delivered during | 
|  | certain primitives (such as @code{open}, @code{read} or @code{write}), | 
|  | and the signal handler returns normally.  There are two alternatives: | 
|  | the library function can resume, or it can return failure with error | 
|  | code @code{EINTR}. | 
|  |  | 
|  | The choice is controlled by the @code{SA_RESTART} flag for the | 
|  | particular kind of signal that was delivered.  If the flag is set, | 
|  | returning from a handler resumes the library function.  If the flag is | 
|  | clear, returning from a handler makes the function fail. | 
|  | @xref{Interrupted Primitives}. | 
|  | @end deftypevr | 
|  |  | 
|  | @node Initial Signal Actions | 
|  | @subsection Initial Signal Actions | 
|  | @cindex initial signal actions | 
|  |  | 
|  | When a new process is created (@pxref{Creating a Process}), it inherits | 
|  | handling of signals from its parent process.  However, when you load a | 
|  | new process image using the @code{exec} function (@pxref{Executing a | 
|  | File}), any signals that you've defined your own handlers for revert to | 
|  | their @code{SIG_DFL} handling.  (If you think about it a little, this | 
|  | makes sense; the handler functions from the old program are specific to | 
|  | that program, and aren't even present in the address space of the new | 
|  | program image.)  Of course, the new program can establish its own | 
|  | handlers. | 
|  |  | 
|  | When a program is run by a shell, the shell normally sets the initial | 
|  | actions for the child process to @code{SIG_DFL} or @code{SIG_IGN}, as | 
|  | appropriate.  It's a good idea to check to make sure that the shell has | 
|  | not set up an initial action of @code{SIG_IGN} before you establish your | 
|  | own signal handlers. | 
|  |  | 
|  | Here is an example of how to establish a handler for @code{SIGHUP}, but | 
|  | not if @code{SIGHUP} is currently ignored: | 
|  |  | 
|  | @smallexample | 
|  | @group | 
|  | @dots{} | 
|  | struct sigaction temp; | 
|  |  | 
|  | sigaction (SIGHUP, NULL, &temp); | 
|  |  | 
|  | if (temp.sa_handler != SIG_IGN) | 
|  | @{ | 
|  | temp.sa_handler = handle_sighup; | 
|  | sigemptyset (&temp.sa_mask); | 
|  | sigaction (SIGHUP, &temp, NULL); | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | @node Defining Handlers | 
|  | @section Defining Signal Handlers | 
|  | @cindex signal handler function | 
|  |  | 
|  | This section describes how to write a signal handler function that can | 
|  | be established with the @code{signal} or @code{sigaction} functions. | 
|  |  | 
|  | A signal handler is just a function that you compile together with the | 
|  | rest of the program.  Instead of directly invoking the function, you use | 
|  | @code{signal} or @code{sigaction} to tell the operating system to call | 
|  | it when a signal arrives.  This is known as @dfn{establishing} the | 
|  | handler.  @xref{Signal Actions}. | 
|  |  | 
|  | There are two basic strategies you can use in signal handler functions: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | You can have the handler function note that the signal arrived by | 
|  | tweaking some global data structures, and then return normally. | 
|  |  | 
|  | @item | 
|  | You can have the handler function terminate the program or transfer | 
|  | control to a point where it can recover from the situation that caused | 
|  | the signal. | 
|  | @end itemize | 
|  |  | 
|  | You need to take special care in writing handler functions because they | 
|  | can be called asynchronously.  That is, a handler might be called at any | 
|  | point in the program, unpredictably.  If two signals arrive during a | 
|  | very short interval, one handler can run within another.  This section | 
|  | describes what your handler should do, and what you should avoid. | 
|  |  | 
|  | @menu | 
|  | * Handler Returns::             Handlers that return normally, and what | 
|  | this means. | 
|  | * Termination in Handler::      How handler functions terminate a program. | 
|  | * Longjmp in Handler::          Nonlocal transfer of control out of a | 
|  | signal handler. | 
|  | * Signals in Handler::          What happens when signals arrive while | 
|  | the handler is already occupied. | 
|  | * Merged Signals::		When a second signal arrives before the | 
|  | first is handled. | 
|  | * Nonreentrancy::               Do not call any functions unless you know they | 
|  | are reentrant with respect to signals. | 
|  | * Atomic Data Access::          A single handler can run in the middle of | 
|  | reading or writing a single object. | 
|  | @end menu | 
|  |  | 
|  | @node Handler Returns | 
|  | @subsection Signal Handlers that Return | 
|  |  | 
|  | Handlers which return normally are usually used for signals such as | 
|  | @code{SIGALRM} and the I/O and interprocess communication signals.  But | 
|  | a handler for @code{SIGINT} might also return normally after setting a | 
|  | flag that tells the program to exit at a convenient time. | 
|  |  | 
|  | It is not safe to return normally from the handler for a program error | 
|  | signal, because the behavior of the program when the handler function | 
|  | returns is not defined after a program error.  @xref{Program Error | 
|  | Signals}. | 
|  |  | 
|  | Handlers that return normally must modify some global variable in order | 
|  | to have any effect.  Typically, the variable is one that is examined | 
|  | periodically by the program during normal operation.  Its data type | 
|  | should be @code{sig_atomic_t} for reasons described in @ref{Atomic | 
|  | Data Access}. | 
|  |  | 
|  | Here is a simple example of such a program.  It executes the body of | 
|  | the loop until it has noticed that a @code{SIGALRM} signal has arrived. | 
|  | This technique is useful because it allows the iteration in progress | 
|  | when the signal arrives to complete before the loop exits. | 
|  |  | 
|  | @smallexample | 
|  | @include sigh1.c.texi | 
|  | @end smallexample | 
|  |  | 
|  | @node Termination in Handler | 
|  | @subsection Handlers That Terminate the Process | 
|  |  | 
|  | Handler functions that terminate the program are typically used to cause | 
|  | orderly cleanup or recovery from program error signals and interactive | 
|  | interrupts. | 
|  |  | 
|  | The cleanest way for a handler to terminate the process is to raise the | 
|  | same signal that ran the handler in the first place.  Here is how to do | 
|  | this: | 
|  |  | 
|  | @smallexample | 
|  | volatile sig_atomic_t fatal_error_in_progress = 0; | 
|  |  | 
|  | void | 
|  | fatal_error_signal (int sig) | 
|  | @{ | 
|  | @group | 
|  | /* @r{Since this handler is established for more than one kind of signal, } | 
|  | @r{it might still get invoked recursively by delivery of some other kind} | 
|  | @r{of signal.  Use a static variable to keep track of that.} */ | 
|  | if (fatal_error_in_progress) | 
|  | raise (sig); | 
|  | fatal_error_in_progress = 1; | 
|  | @end group | 
|  |  | 
|  | @group | 
|  | /* @r{Now do the clean up actions:} | 
|  | @r{- reset terminal modes} | 
|  | @r{- kill child processes} | 
|  | @r{- remove lock files} */ | 
|  | @dots{} | 
|  | @end group | 
|  |  | 
|  | @group | 
|  | /* @r{Now reraise the signal.  We reactivate the signal's} | 
|  | @r{default handling, which is to terminate the process.} | 
|  | @r{We could just call @code{exit} or @code{abort},} | 
|  | @r{but reraising the signal sets the return status} | 
|  | @r{from the process correctly.} */ | 
|  | signal (sig, SIG_DFL); | 
|  | raise (sig); | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | @node Longjmp in Handler | 
|  | @subsection Nonlocal Control Transfer in Handlers | 
|  | @cindex non-local exit, from signal handler | 
|  |  | 
|  | You can do a nonlocal transfer of control out of a signal handler using | 
|  | the @code{setjmp} and @code{longjmp} facilities (@pxref{Non-Local | 
|  | Exits}). | 
|  |  | 
|  | When the handler does a nonlocal control transfer, the part of the | 
|  | program that was running will not continue.  If this part of the program | 
|  | was in the middle of updating an important data structure, the data | 
|  | structure will remain inconsistent.  Since the program does not | 
|  | terminate, the inconsistency is likely to be noticed later on. | 
|  |  | 
|  | There are two ways to avoid this problem.  One is to block the signal | 
|  | for the parts of the program that update important data structures. | 
|  | Blocking the signal delays its delivery until it is unblocked, once the | 
|  | critical updating is finished.  @xref{Blocking Signals}. | 
|  |  | 
|  | The other way is to re-initialize the crucial data structures in the | 
|  | signal handler, or to make their values consistent. | 
|  |  | 
|  | Here is a rather schematic example showing the reinitialization of one | 
|  | global variable. | 
|  |  | 
|  | @smallexample | 
|  | @group | 
|  | #include <signal.h> | 
|  | #include <setjmp.h> | 
|  |  | 
|  | jmp_buf return_to_top_level; | 
|  |  | 
|  | volatile sig_atomic_t waiting_for_input; | 
|  |  | 
|  | void | 
|  | handle_sigint (int signum) | 
|  | @{ | 
|  | /* @r{We may have been waiting for input when the signal arrived,} | 
|  | @r{but we are no longer waiting once we transfer control.} */ | 
|  | waiting_for_input = 0; | 
|  | longjmp (return_to_top_level, 1); | 
|  | @} | 
|  | @end group | 
|  |  | 
|  | @group | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | @dots{} | 
|  | signal (SIGINT, sigint_handler); | 
|  | @dots{} | 
|  | while (1) @{ | 
|  | prepare_for_command (); | 
|  | if (setjmp (return_to_top_level) == 0) | 
|  | read_and_execute_command (); | 
|  | @} | 
|  | @} | 
|  | @end group | 
|  |  | 
|  | @group | 
|  | /* @r{Imagine this is a subroutine used by various commands.} */ | 
|  | char * | 
|  | read_data () | 
|  | @{ | 
|  | if (input_from_terminal) @{ | 
|  | waiting_for_input = 1; | 
|  | @dots{} | 
|  | waiting_for_input = 0; | 
|  | @} else @{ | 
|  | @dots{} | 
|  | @} | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  |  | 
|  | @node Signals in Handler | 
|  | @subsection Signals Arriving While a Handler Runs | 
|  | @cindex race conditions, relating to signals | 
|  |  | 
|  | What happens if another signal arrives while your signal handler | 
|  | function is running? | 
|  |  | 
|  | When the handler for a particular signal is invoked, that signal is | 
|  | automatically blocked until the handler returns.  That means that if two | 
|  | signals of the same kind arrive close together, the second one will be | 
|  | held until the first has been handled.  (The handler can explicitly | 
|  | unblock the signal using @code{sigprocmask}, if you want to allow more | 
|  | signals of this type to arrive; see @ref{Process Signal Mask}.) | 
|  |  | 
|  | However, your handler can still be interrupted by delivery of another | 
|  | kind of signal.  To avoid this, you can use the @code{sa_mask} member of | 
|  | the action structure passed to @code{sigaction} to explicitly specify | 
|  | which signals should be blocked while the signal handler runs.  These | 
|  | signals are in addition to the signal for which the handler was invoked, | 
|  | and any other signals that are normally blocked by the process. | 
|  | @xref{Blocking for Handler}. | 
|  |  | 
|  | When the handler returns, the set of blocked signals is restored to the | 
|  | value it had before the handler ran.  So using @code{sigprocmask} inside | 
|  | the handler only affects what signals can arrive during the execution of | 
|  | the handler itself, not what signals can arrive once the handler returns. | 
|  |  | 
|  | @strong{Portability Note:} Always use @code{sigaction} to establish a | 
|  | handler for a signal that you expect to receive asynchronously, if you | 
|  | want your program to work properly on System V Unix.  On this system, | 
|  | the handling of a signal whose handler was established with | 
|  | @code{signal} automatically sets the signal's action back to | 
|  | @code{SIG_DFL}, and the handler must re-establish itself each time it | 
|  | runs.  This practice, while inconvenient, does work when signals cannot | 
|  | arrive in succession.  However, if another signal can arrive right away, | 
|  | it may arrive before the handler can re-establish itself.  Then the | 
|  | second signal would receive the default handling, which could terminate | 
|  | the process. | 
|  |  | 
|  | @node Merged Signals | 
|  | @subsection Signals Close Together Merge into One | 
|  | @cindex handling multiple signals | 
|  | @cindex successive signals | 
|  | @cindex merging of signals | 
|  |  | 
|  | If multiple signals of the same type are delivered to your process | 
|  | before your signal handler has a chance to be invoked at all, the | 
|  | handler may only be invoked once, as if only a single signal had | 
|  | arrived.  In effect, the signals merge into one.  This situation can | 
|  | arise when the signal is blocked, or in a multiprocessing environment | 
|  | where the system is busy running some other processes while the signals | 
|  | are delivered.  This means, for example, that you cannot reliably use a | 
|  | signal handler to count signals.  The only distinction you can reliably | 
|  | make is whether at least one signal has arrived since a given time in | 
|  | the past. | 
|  |  | 
|  | Here is an example of a handler for @code{SIGCHLD} that compensates for | 
|  | the fact that the number of signals received may not equal the number of | 
|  | child processes that generate them.  It assumes that the program keeps track | 
|  | of all the child processes with a chain of structures as follows: | 
|  |  | 
|  | @smallexample | 
|  | struct process | 
|  | @{ | 
|  | struct process *next; | 
|  | /* @r{The process ID of this child.}  */ | 
|  | int pid; | 
|  | /* @r{The descriptor of the pipe or pseudo terminal} | 
|  | @r{on which output comes from this child.}  */ | 
|  | int input_descriptor; | 
|  | /* @r{Nonzero if this process has stopped or terminated.}  */ | 
|  | sig_atomic_t have_status; | 
|  | /* @r{The status of this child; 0 if running,} | 
|  | @r{otherwise a status value from @code{waitpid}.}  */ | 
|  | int status; | 
|  | @}; | 
|  |  | 
|  | struct process *process_list; | 
|  | @end smallexample | 
|  |  | 
|  | This example also uses a flag to indicate whether signals have arrived | 
|  | since some time in the past---whenever the program last cleared it to | 
|  | zero. | 
|  |  | 
|  | @smallexample | 
|  | /* @r{Nonzero means some child's status has changed} | 
|  | @r{so look at @code{process_list} for the details.}  */ | 
|  | int process_status_change; | 
|  | @end smallexample | 
|  |  | 
|  | Here is the handler itself: | 
|  |  | 
|  | @smallexample | 
|  | void | 
|  | sigchld_handler (int signo) | 
|  | @{ | 
|  | int old_errno = errno; | 
|  |  | 
|  | while (1) @{ | 
|  | register int pid; | 
|  | int w; | 
|  | struct process *p; | 
|  |  | 
|  | /* @r{Keep asking for a status until we get a definitive result.}  */ | 
|  | do | 
|  | @{ | 
|  | errno = 0; | 
|  | pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED); | 
|  | @} | 
|  | while (pid <= 0 && errno == EINTR); | 
|  |  | 
|  | if (pid <= 0) @{ | 
|  | /* @r{A real failure means there are no more} | 
|  | @r{stopped or terminated child processes, so return.}  */ | 
|  | errno = old_errno; | 
|  | return; | 
|  | @} | 
|  |  | 
|  | /* @r{Find the process that signaled us, and record its status.}  */ | 
|  |  | 
|  | for (p = process_list; p; p = p->next) | 
|  | if (p->pid == pid) @{ | 
|  | p->status = w; | 
|  | /* @r{Indicate that the @code{status} field} | 
|  | @r{has data to look at.  We do this only after storing it.}  */ | 
|  | p->have_status = 1; | 
|  |  | 
|  | /* @r{If process has terminated, stop waiting for its output.}  */ | 
|  | if (WIFSIGNALED (w) || WIFEXITED (w)) | 
|  | if (p->input_descriptor) | 
|  | FD_CLR (p->input_descriptor, &input_wait_mask); | 
|  |  | 
|  | /* @r{The program should check this flag from time to time} | 
|  | @r{to see if there is any news in @code{process_list}.}  */ | 
|  | ++process_status_change; | 
|  | @} | 
|  |  | 
|  | /* @r{Loop around to handle all the processes} | 
|  | @r{that have something to tell us.}  */ | 
|  | @} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | Here is the proper way to check the flag @code{process_status_change}: | 
|  |  | 
|  | @smallexample | 
|  | if (process_status_change) @{ | 
|  | struct process *p; | 
|  | process_status_change = 0; | 
|  | for (p = process_list; p; p = p->next) | 
|  | if (p->have_status) @{ | 
|  | @dots{} @r{Examine @code{p->status}} @dots{} | 
|  | @} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | @noindent | 
|  | It is vital to clear the flag before examining the list; otherwise, if a | 
|  | signal were delivered just before the clearing of the flag, and after | 
|  | the appropriate element of the process list had been checked, the status | 
|  | change would go unnoticed until the next signal arrived to set the flag | 
|  | again.  You could, of course, avoid this problem by blocking the signal | 
|  | while scanning the list, but it is much more elegant to guarantee | 
|  | correctness by doing things in the right order. | 
|  |  | 
|  | The loop which checks process status avoids examining @code{p->status} | 
|  | until it sees that status has been validly stored.  This is to make sure | 
|  | that the status cannot change in the middle of accessing it.  Once | 
|  | @code{p->have_status} is set, it means that the child process is stopped | 
|  | or terminated, and in either case, it cannot stop or terminate again | 
|  | until the program has taken notice.  @xref{Atomic Usage}, for more | 
|  | information about coping with interruptions during accesses of a | 
|  | variable. | 
|  |  | 
|  | Here is another way you can test whether the handler has run since the | 
|  | last time you checked.  This technique uses a counter which is never | 
|  | changed outside the handler.  Instead of clearing the count, the program | 
|  | remembers the previous value and sees whether it has changed since the | 
|  | previous check.  The advantage of this method is that different parts of | 
|  | the program can check independently, each part checking whether there | 
|  | has been a signal since that part last checked. | 
|  |  | 
|  | @smallexample | 
|  | sig_atomic_t process_status_change; | 
|  |  | 
|  | sig_atomic_t last_process_status_change; | 
|  |  | 
|  | @dots{} | 
|  | @{ | 
|  | sig_atomic_t prev = last_process_status_change; | 
|  | last_process_status_change = process_status_change; | 
|  | if (last_process_status_change != prev) @{ | 
|  | struct process *p; | 
|  | for (p = process_list; p; p = p->next) | 
|  | if (p->have_status) @{ | 
|  | @dots{} @r{Examine @code{p->status}} @dots{} | 
|  | @} | 
|  | @} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | @node Nonreentrancy | 
|  | @subsection Signal Handling and Nonreentrant Functions | 
|  | @cindex restrictions on signal handler functions | 
|  |  | 
|  | Handler functions usually don't do very much.  The best practice is to | 
|  | write a handler that does nothing but set an external variable that the | 
|  | program checks regularly, and leave all serious work to the program. | 
|  | This is best because the handler can be called asynchronously, at | 
|  | unpredictable times---perhaps in the middle of a primitive function, or | 
|  | even between the beginning and the end of a C operator that requires | 
|  | multiple instructions.  The data structures being manipulated might | 
|  | therefore be in an inconsistent state when the handler function is | 
|  | invoked.  Even copying one @code{int} variable into another can take two | 
|  | instructions on most machines. | 
|  |  | 
|  | This means you have to be very careful about what you do in a signal | 
|  | handler. | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | @cindex @code{volatile} declarations | 
|  | If your handler needs to access any global variables from your program, | 
|  | declare those variables @code{volatile}.  This tells the compiler that | 
|  | the value of the variable might change asynchronously, and inhibits | 
|  | certain optimizations that would be invalidated by such modifications. | 
|  |  | 
|  | @item | 
|  | @cindex reentrant functions | 
|  | If you call a function in the handler, make sure it is @dfn{reentrant} | 
|  | with respect to signals, or else make sure that the signal cannot | 
|  | interrupt a call to a related function. | 
|  | @end itemize | 
|  |  | 
|  | A function can be non-reentrant if it uses memory that is not on the | 
|  | stack. | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | If a function uses a static variable or a global variable, or a | 
|  | dynamically-allocated object that it finds for itself, then it is | 
|  | non-reentrant and any two calls to the function can interfere. | 
|  |  | 
|  | For example, suppose that the signal handler uses @code{gethostbyname}. | 
|  | This function returns its value in a static object, reusing the same | 
|  | object each time.  If the signal happens to arrive during a call to | 
|  | @code{gethostbyname}, or even after one (while the program is still | 
|  | using the value), it will clobber the value that the program asked for. | 
|  |  | 
|  | However, if the program does not use @code{gethostbyname} or any other | 
|  | function that returns information in the same object, or if it always | 
|  | blocks signals around each use, then you are safe. | 
|  |  | 
|  | There are a large number of library functions that return values in a | 
|  | fixed object, always reusing the same object in this fashion, and all of | 
|  | them cause the same problem.  Function descriptions in this manual | 
|  | always mention this behavior. | 
|  |  | 
|  | @item | 
|  | If a function uses and modifies an object that you supply, then it is | 
|  | potentially non-reentrant; two calls can interfere if they use the same | 
|  | object. | 
|  |  | 
|  | This case arises when you do I/O using streams.  Suppose that the | 
|  | signal handler prints a message with @code{fprintf}.  Suppose that the | 
|  | program was in the middle of an @code{fprintf} call using the same | 
|  | stream when the signal was delivered.  Both the signal handler's message | 
|  | and the program's data could be corrupted, because both calls operate on | 
|  | the same data structure---the stream itself. | 
|  |  | 
|  | However, if you know that the stream that the handler uses cannot | 
|  | possibly be used by the program at a time when signals can arrive, then | 
|  | you are safe.  It is no problem if the program uses some other stream. | 
|  |  | 
|  | @item | 
|  | On most systems, @code{malloc} and @code{free} are not reentrant, | 
|  | because they use a static data structure which records what memory | 
|  | blocks are free.  As a result, no library functions that allocate or | 
|  | free memory are reentrant.  This includes functions that allocate space | 
|  | to store a result. | 
|  |  | 
|  | The best way to avoid the need to allocate memory in a handler is to | 
|  | allocate in advance space for signal handlers to use. | 
|  |  | 
|  | The best way to avoid freeing memory in a handler is to flag or record | 
|  | the objects to be freed, and have the program check from time to time | 
|  | whether anything is waiting to be freed.  But this must be done with | 
|  | care, because placing an object on a chain is not atomic, and if it is | 
|  | interrupted by another signal handler that does the same thing, you | 
|  | could ``lose'' one of the objects. | 
|  |  | 
|  | @ignore | 
|  | !!! not true | 
|  | In @theglibc{}, @code{malloc} and @code{free} are safe to use in | 
|  | signal handlers because they block signals.  As a result, the library | 
|  | functions that allocate space for a result are also safe in signal | 
|  | handlers.  The obstack allocation functions are safe as long as you | 
|  | don't use the same obstack both inside and outside of a signal handler. | 
|  | @end ignore | 
|  |  | 
|  | @ignore | 
|  | @comment Once we have r_alloc again add this paragraph. | 
|  | The relocating allocation functions (@pxref{Relocating Allocator}) | 
|  | are certainly not safe to use in a signal handler. | 
|  | @end ignore | 
|  |  | 
|  | @item | 
|  | Any function that modifies @code{errno} is non-reentrant, but you can | 
|  | correct for this: in the handler, save the original value of | 
|  | @code{errno} and restore it before returning normally.  This prevents | 
|  | errors that occur within the signal handler from being confused with | 
|  | errors from system calls at the point the program is interrupted to run | 
|  | the handler. | 
|  |  | 
|  | This technique is generally applicable; if you want to call in a handler | 
|  | a function that modifies a particular object in memory, you can make | 
|  | this safe by saving and restoring that object. | 
|  |  | 
|  | @item | 
|  | Merely reading from a memory object is safe provided that you can deal | 
|  | with any of the values that might appear in the object at a time when | 
|  | the signal can be delivered.  Keep in mind that assignment to some data | 
|  | types requires more than one instruction, which means that the handler | 
|  | could run ``in the middle of'' an assignment to the variable if its type | 
|  | is not atomic.  @xref{Atomic Data Access}. | 
|  |  | 
|  | @item | 
|  | Merely writing into a memory object is safe as long as a sudden change | 
|  | in the value, at any time when the handler might run, will not disturb | 
|  | anything. | 
|  | @end itemize | 
|  |  | 
|  | @node Atomic Data Access | 
|  | @subsection Atomic Data Access and Signal Handling | 
|  |  | 
|  | Whether the data in your application concerns atoms, or mere text, you | 
|  | have to be careful about the fact that access to a single datum is not | 
|  | necessarily @dfn{atomic}.  This means that it can take more than one | 
|  | instruction to read or write a single object.  In such cases, a signal | 
|  | handler might be invoked in the middle of reading or writing the object. | 
|  |  | 
|  | There are three ways you can cope with this problem.  You can use data | 
|  | types that are always accessed atomically; you can carefully arrange | 
|  | that nothing untoward happens if an access is interrupted, or you can | 
|  | block all signals around any access that had better not be interrupted | 
|  | (@pxref{Blocking Signals}). | 
|  |  | 
|  | @menu | 
|  | * Non-atomic Example::		A program illustrating interrupted access. | 
|  | * Types: Atomic Types.		Data types that guarantee no interruption. | 
|  | * Usage: Atomic Usage.		Proving that interruption is harmless. | 
|  | @end menu | 
|  |  | 
|  | @node Non-atomic Example | 
|  | @subsubsection Problems with Non-Atomic Access | 
|  |  | 
|  | Here is an example which shows what can happen if a signal handler runs | 
|  | in the middle of modifying a variable.  (Interrupting the reading of a | 
|  | variable can also lead to paradoxical results, but here we only show | 
|  | writing.) | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  | #include <stdio.h> | 
|  |  | 
|  | volatile struct two_words @{ int a, b; @} memory; | 
|  |  | 
|  | void | 
|  | handler(int signum) | 
|  | @{ | 
|  | printf ("%d,%d\n", memory.a, memory.b); | 
|  | alarm (1); | 
|  | @} | 
|  |  | 
|  | @group | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | static struct two_words zeros = @{ 0, 0 @}, ones = @{ 1, 1 @}; | 
|  | signal (SIGALRM, handler); | 
|  | memory = zeros; | 
|  | alarm (1); | 
|  | while (1) | 
|  | @{ | 
|  | memory = zeros; | 
|  | memory = ones; | 
|  | @} | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | This program fills @code{memory} with zeros, ones, zeros, ones, | 
|  | alternating forever; meanwhile, once per second, the alarm signal handler | 
|  | prints the current contents.  (Calling @code{printf} in the handler is | 
|  | safe in this program because it is certainly not being called outside | 
|  | the handler when the signal happens.) | 
|  |  | 
|  | Clearly, this program can print a pair of zeros or a pair of ones.  But | 
|  | that's not all it can do!  On most machines, it takes several | 
|  | instructions to store a new value in @code{memory}, and the value is | 
|  | stored one word at a time.  If the signal is delivered in between these | 
|  | instructions, the handler might find that @code{memory.a} is zero and | 
|  | @code{memory.b} is one (or vice versa). | 
|  |  | 
|  | On some machines it may be possible to store a new value in | 
|  | @code{memory} with just one instruction that cannot be interrupted.  On | 
|  | these machines, the handler will always print two zeros or two ones. | 
|  |  | 
|  | @node Atomic Types | 
|  | @subsubsection Atomic Types | 
|  |  | 
|  | To avoid uncertainty about interrupting access to a variable, you can | 
|  | use a particular data type for which access is always atomic: | 
|  | @code{sig_atomic_t}.  Reading and writing this data type is guaranteed | 
|  | to happen in a single instruction, so there's no way for a handler to | 
|  | run ``in the middle'' of an access. | 
|  |  | 
|  | The type @code{sig_atomic_t} is always an integer data type, but which | 
|  | one it is, and how many bits it contains, may vary from machine to | 
|  | machine. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftp {Data Type} sig_atomic_t | 
|  | This is an integer data type.  Objects of this type are always accessed | 
|  | atomically. | 
|  | @end deftp | 
|  |  | 
|  | In practice, you can assume that @code{int} is atomic. | 
|  | You can also assume that pointer | 
|  | types are atomic; that is very convenient.  Both of these assumptions | 
|  | are true on all of the machines that @theglibc{} supports and on | 
|  | all POSIX systems we know of. | 
|  | @c ??? This might fail on a 386 that uses 64-bit pointers. | 
|  |  | 
|  | @node Atomic Usage | 
|  | @subsubsection Atomic Usage Patterns | 
|  |  | 
|  | Certain patterns of access avoid any problem even if an access is | 
|  | interrupted.  For example, a flag which is set by the handler, and | 
|  | tested and cleared by the main program from time to time, is always safe | 
|  | even if access actually requires two instructions.  To show that this is | 
|  | so, we must consider each access that could be interrupted, and show | 
|  | that there is no problem if it is interrupted. | 
|  |  | 
|  | An interrupt in the middle of testing the flag is safe because either it's | 
|  | recognized to be nonzero, in which case the precise value doesn't | 
|  | matter, or it will be seen to be nonzero the next time it's tested. | 
|  |  | 
|  | An interrupt in the middle of clearing the flag is no problem because | 
|  | either the value ends up zero, which is what happens if a signal comes | 
|  | in just before the flag is cleared, or the value ends up nonzero, and | 
|  | subsequent events occur as if the signal had come in just after the flag | 
|  | was cleared.  As long as the code handles both of these cases properly, | 
|  | it can also handle a signal in the middle of clearing the flag.  (This | 
|  | is an example of the sort of reasoning you need to do to figure out | 
|  | whether non-atomic usage is safe.) | 
|  |  | 
|  | Sometimes you can insure uninterrupted access to one object by | 
|  | protecting its use with another object, perhaps one whose type | 
|  | guarantees atomicity.  @xref{Merged Signals}, for an example. | 
|  |  | 
|  | @node Interrupted Primitives | 
|  | @section Primitives Interrupted by Signals | 
|  |  | 
|  | A signal can arrive and be handled while an I/O primitive such as | 
|  | @code{open} or @code{read} is waiting for an I/O device.  If the signal | 
|  | handler returns, the system faces the question: what should happen next? | 
|  |  | 
|  | POSIX specifies one approach: make the primitive fail right away.  The | 
|  | error code for this kind of failure is @code{EINTR}.  This is flexible, | 
|  | but usually inconvenient.  Typically, POSIX applications that use signal | 
|  | handlers must check for @code{EINTR} after each library function that | 
|  | can return it, in order to try the call again.  Often programmers forget | 
|  | to check, which is a common source of error. | 
|  |  | 
|  | @Theglibc{} provides a convenient way to retry a call after a | 
|  | temporary failure, with the macro @code{TEMP_FAILURE_RETRY}: | 
|  |  | 
|  | @comment unistd.h | 
|  | @comment GNU | 
|  | @defmac TEMP_FAILURE_RETRY (@var{expression}) | 
|  | This macro evaluates @var{expression} once, and examines its value as | 
|  | type @code{long int}.  If the value equals @code{-1}, that indicates a | 
|  | failure and @code{errno} should be set to show what kind of failure. | 
|  | If it fails and reports error code @code{EINTR}, | 
|  | @code{TEMP_FAILURE_RETRY} evaluates it again, and over and over until | 
|  | the result is not a temporary failure. | 
|  |  | 
|  | The value returned by @code{TEMP_FAILURE_RETRY} is whatever value | 
|  | @var{expression} produced. | 
|  | @end defmac | 
|  |  | 
|  | BSD avoids @code{EINTR} entirely and provides a more convenient | 
|  | approach: to restart the interrupted primitive, instead of making it | 
|  | fail.  If you choose this approach, you need not be concerned with | 
|  | @code{EINTR}. | 
|  |  | 
|  | You can choose either approach with @theglibc{}.  If you use | 
|  | @code{sigaction} to establish a signal handler, you can specify how that | 
|  | handler should behave.  If you specify the @code{SA_RESTART} flag, | 
|  | return from that handler will resume a primitive; otherwise, return from | 
|  | that handler will cause @code{EINTR}.  @xref{Flags for Sigaction}. | 
|  |  | 
|  | Another way to specify the choice is with the @code{siginterrupt} | 
|  | function.  @xref{BSD Signal Handling}. | 
|  |  | 
|  | When you don't specify with @code{sigaction} or @code{siginterrupt} what | 
|  | a particular handler should do, it uses a default choice.  The default | 
|  | choice in @theglibc{} is to make primitives fail with @code{EINTR}. | 
|  | @cindex EINTR, and restarting interrupted primitives | 
|  | @cindex restarting interrupted primitives | 
|  | @cindex interrupting primitives | 
|  | @cindex primitives, interrupting | 
|  | @c !!! want to have @cindex system calls @i{see} primitives [no page #] | 
|  |  | 
|  | The description of each primitive affected by this issue | 
|  | lists @code{EINTR} among the error codes it can return. | 
|  |  | 
|  | There is one situation where resumption never happens no matter which | 
|  | choice you make: when a data-transfer function such as @code{read} or | 
|  | @code{write} is interrupted by a signal after transferring part of the | 
|  | data.  In this case, the function returns the number of bytes already | 
|  | transferred, indicating partial success. | 
|  |  | 
|  | This might at first appear to cause unreliable behavior on | 
|  | record-oriented devices (including datagram sockets; @pxref{Datagrams}), | 
|  | where splitting one @code{read} or @code{write} into two would read or | 
|  | write two records.  Actually, there is no problem, because interruption | 
|  | after a partial transfer cannot happen on such devices; they always | 
|  | transfer an entire record in one burst, with no waiting once data | 
|  | transfer has started. | 
|  |  | 
|  | @node Generating Signals | 
|  | @section Generating Signals | 
|  | @cindex sending signals | 
|  | @cindex raising signals | 
|  | @cindex signals, generating | 
|  |  | 
|  | Besides signals that are generated as a result of a hardware trap or | 
|  | interrupt, your program can explicitly send signals to itself or to | 
|  | another process. | 
|  |  | 
|  | @menu | 
|  | * Signaling Yourself::          A process can send a signal to itself. | 
|  | * Signaling Another Process::   Send a signal to another process. | 
|  | * Permission for kill::         Permission for using @code{kill}. | 
|  | * Kill Example::                Using @code{kill} for Communication. | 
|  | @end menu | 
|  |  | 
|  | @node Signaling Yourself | 
|  | @subsection Signaling Yourself | 
|  |  | 
|  | A process can send itself a signal with the @code{raise} function.  This | 
|  | function is declared in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment ISO | 
|  | @deftypefun int raise (int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c raise ok | 
|  | @c [posix] | 
|  | @c  getpid dup ok | 
|  | @c  kill dup ok | 
|  | @c [linux] | 
|  | @c  syscall(gettid) ok | 
|  | @c  syscall(tgkill) ok | 
|  | The @code{raise} function sends the signal @var{signum} to the calling | 
|  | process.  It returns zero if successful and a nonzero value if it fails. | 
|  | About the only reason for failure would be if the value of @var{signum} | 
|  | is invalid. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment SVID | 
|  | @deftypefun int gsignal (int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c Aliases raise. | 
|  | The @code{gsignal} function does the same thing as @code{raise}; it is | 
|  | provided only for compatibility with SVID. | 
|  | @end deftypefun | 
|  |  | 
|  | One convenient use for @code{raise} is to reproduce the default behavior | 
|  | of a signal that you have trapped.  For instance, suppose a user of your | 
|  | program types the SUSP character (usually @kbd{C-z}; @pxref{Special | 
|  | Characters}) to send it an interactive stop signal | 
|  | (@code{SIGTSTP}), and you want to clean up some internal data buffers | 
|  | before stopping.  You might set this up like this: | 
|  |  | 
|  | @comment RMS suggested getting rid of the handler for SIGCONT in this function. | 
|  | @comment But that would require that the handler for SIGTSTP unblock the | 
|  | @comment signal before doing the call to raise.  We haven't covered that | 
|  | @comment topic yet, and I don't want to distract from the main point of | 
|  | @comment the example with a digression to explain what is going on.  As | 
|  | @comment the example is written, the signal that is raise'd will be delivered | 
|  | @comment as soon as the SIGTSTP handler returns, which is fine. | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  |  | 
|  | /* @r{When a stop signal arrives, set the action back to the default | 
|  | and then resend the signal after doing cleanup actions.} */ | 
|  |  | 
|  | void | 
|  | tstp_handler (int sig) | 
|  | @{ | 
|  | signal (SIGTSTP, SIG_DFL); | 
|  | /* @r{Do cleanup actions here.} */ | 
|  | @dots{} | 
|  | raise (SIGTSTP); | 
|  | @} | 
|  |  | 
|  | /* @r{When the process is continued again, restore the signal handler.} */ | 
|  |  | 
|  | void | 
|  | cont_handler (int sig) | 
|  | @{ | 
|  | signal (SIGCONT, cont_handler); | 
|  | signal (SIGTSTP, tstp_handler); | 
|  | @} | 
|  |  | 
|  | @group | 
|  | /* @r{Enable both handlers during program initialization.} */ | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | signal (SIGCONT, cont_handler); | 
|  | signal (SIGTSTP, tstp_handler); | 
|  | @dots{} | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | @strong{Portability note:} @code{raise} was invented by the @w{ISO C} | 
|  | committee.  Older systems may not support it, so using @code{kill} may | 
|  | be more portable.  @xref{Signaling Another Process}. | 
|  |  | 
|  | @node Signaling Another Process | 
|  | @subsection Signaling Another Process | 
|  |  | 
|  | @cindex killing a process | 
|  | The @code{kill} function can be used to send a signal to another process. | 
|  | In spite of its name, it can be used for a lot of things other than | 
|  | causing a process to terminate.  Some examples of situations where you | 
|  | might want to send signals between processes are: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | A parent process starts a child to perform a task---perhaps having the | 
|  | child running an infinite loop---and then terminates the child when the | 
|  | task is no longer needed. | 
|  |  | 
|  | @item | 
|  | A process executes as part of a group, and needs to terminate or notify | 
|  | the other processes in the group when an error or other event occurs. | 
|  |  | 
|  | @item | 
|  | Two processes need to synchronize while working together. | 
|  | @end itemize | 
|  |  | 
|  | This section assumes that you know a little bit about how processes | 
|  | work.  For more information on this subject, see @ref{Processes}. | 
|  |  | 
|  | The @code{kill} function is declared in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int kill (pid_t @var{pid}, int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c The hurd implementation is not a critical section, so it's not | 
|  | @c immediately obvious that, in case of cancellation, it won't leak | 
|  | @c ports or the memory allocated by proc_getpgrppids when pid <= 0. | 
|  | @c Since none of these make it AC-Unsafe, I'm leaving them out. | 
|  | The @code{kill} function sends the signal @var{signum} to the process | 
|  | or process group specified by @var{pid}.  Besides the signals listed in | 
|  | @ref{Standard Signals}, @var{signum} can also have a value of zero to | 
|  | check the validity of the @var{pid}. | 
|  |  | 
|  | The @var{pid} specifies the process or process group to receive the | 
|  | signal: | 
|  |  | 
|  | @table @code | 
|  | @item @var{pid} > 0 | 
|  | The process whose identifier is @var{pid}. | 
|  |  | 
|  | @item @var{pid} == 0 | 
|  | All processes in the same process group as the sender. | 
|  |  | 
|  | @item @var{pid} < -1 | 
|  | The process group whose identifier is @minus{}@var{pid}. | 
|  |  | 
|  | @item @var{pid} == -1 | 
|  | If the process is privileged, send the signal to all processes except | 
|  | for some special system processes.  Otherwise, send the signal to all | 
|  | processes with the same effective user ID. | 
|  | @end table | 
|  |  | 
|  | A process can send a signal to itself with a call like @w{@code{kill | 
|  | (getpid(), @var{signum})}}.  If @code{kill} is used by a process to send | 
|  | a signal to itself, and the signal is not blocked, then @code{kill} | 
|  | delivers at least one signal (which might be some other pending | 
|  | unblocked signal instead of the signal @var{signum}) to that process | 
|  | before it returns. | 
|  |  | 
|  | The return value from @code{kill} is zero if the signal can be sent | 
|  | successfully.  Otherwise, no signal is sent, and a value of @code{-1} is | 
|  | returned.  If @var{pid} specifies sending a signal to several processes, | 
|  | @code{kill} succeeds if it can send the signal to at least one of them. | 
|  | There's no way you can tell which of the processes got the signal | 
|  | or whether all of them did. | 
|  |  | 
|  | The following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The @var{signum} argument is an invalid or unsupported number. | 
|  |  | 
|  | @item EPERM | 
|  | You do not have the privilege to send a signal to the process or any of | 
|  | the processes in the process group named by @var{pid}. | 
|  |  | 
|  | @item ESRCH | 
|  | The @var{pid} argument does not refer to an existing process or group. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun int killpg (int @var{pgid}, int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c Calls kill with -pgid. | 
|  | This is similar to @code{kill}, but sends signal @var{signum} to the | 
|  | process group @var{pgid}.  This function is provided for compatibility | 
|  | with BSD; using @code{kill} to do this is more portable. | 
|  | @end deftypefun | 
|  |  | 
|  | As a simple example of @code{kill}, the call @w{@code{kill (getpid (), | 
|  | @var{sig})}} has the same effect as @w{@code{raise (@var{sig})}}. | 
|  |  | 
|  | @node Permission for kill | 
|  | @subsection Permission for using @code{kill} | 
|  |  | 
|  | There are restrictions that prevent you from using @code{kill} to send | 
|  | signals to any random process.  These are intended to prevent antisocial | 
|  | behavior such as arbitrarily killing off processes belonging to another | 
|  | user.  In typical use, @code{kill} is used to pass signals between | 
|  | parent, child, and sibling processes, and in these situations you | 
|  | normally do have permission to send signals.  The only common exception | 
|  | is when you run a setuid program in a child process; if the program | 
|  | changes its real UID as well as its effective UID, you may not have | 
|  | permission to send a signal.  The @code{su} program does this. | 
|  |  | 
|  | Whether a process has permission to send a signal to another process | 
|  | is determined by the user IDs of the two processes.  This concept is | 
|  | discussed in detail in @ref{Process Persona}. | 
|  |  | 
|  | Generally, for a process to be able to send a signal to another process, | 
|  | either the sending process must belong to a privileged user (like | 
|  | @samp{root}), or the real or effective user ID of the sending process | 
|  | must match the real or effective user ID of the receiving process.  If | 
|  | the receiving process has changed its effective user ID from the | 
|  | set-user-ID mode bit on its process image file, then the owner of the | 
|  | process image file is used in place of its current effective user ID. | 
|  | In some implementations, a parent process might be able to send signals | 
|  | to a child process even if the user ID's don't match, and other | 
|  | implementations might enforce other restrictions. | 
|  |  | 
|  | The @code{SIGCONT} signal is a special case.  It can be sent if the | 
|  | sender is part of the same session as the receiver, regardless of | 
|  | user IDs. | 
|  |  | 
|  | @node Kill Example | 
|  | @subsection Using @code{kill} for Communication | 
|  | @cindex interprocess communication, with signals | 
|  | Here is a longer example showing how signals can be used for | 
|  | interprocess communication.  This is what the @code{SIGUSR1} and | 
|  | @code{SIGUSR2} signals are provided for.  Since these signals are fatal | 
|  | by default, the process that is supposed to receive them must trap them | 
|  | through @code{signal} or @code{sigaction}. | 
|  |  | 
|  | In this example, a parent process forks a child process and then waits | 
|  | for the child to complete its initialization.  The child process tells | 
|  | the parent when it is ready by sending it a @code{SIGUSR1} signal, using | 
|  | the @code{kill} function. | 
|  |  | 
|  | @smallexample | 
|  | @include sigusr.c.texi | 
|  | @end smallexample | 
|  |  | 
|  | This example uses a busy wait, which is bad, because it wastes CPU | 
|  | cycles that other programs could otherwise use.  It is better to ask the | 
|  | system to wait until the signal arrives.  See the example in | 
|  | @ref{Waiting for a Signal}. | 
|  |  | 
|  | @node Blocking Signals | 
|  | @section Blocking Signals | 
|  | @cindex blocking signals | 
|  |  | 
|  | Blocking a signal means telling the operating system to hold it and | 
|  | deliver it later.  Generally, a program does not block signals | 
|  | indefinitely---it might as well ignore them by setting their actions to | 
|  | @code{SIG_IGN}.  But it is useful to block signals briefly, to prevent | 
|  | them from interrupting sensitive operations.  For instance: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | You can use the @code{sigprocmask} function to block signals while you | 
|  | modify global variables that are also modified by the handlers for these | 
|  | signals. | 
|  |  | 
|  | @item | 
|  | You can set @code{sa_mask} in your @code{sigaction} call to block | 
|  | certain signals while a particular signal handler runs.  This way, the | 
|  | signal handler can run without being interrupted itself by signals. | 
|  | @end itemize | 
|  |  | 
|  | @menu | 
|  | * Why Block::                           The purpose of blocking signals. | 
|  | * Signal Sets::                         How to specify which signals to | 
|  | block. | 
|  | * Process Signal Mask::                 Blocking delivery of signals to your | 
|  | process during normal execution. | 
|  | * Testing for Delivery::                Blocking to Test for Delivery of | 
|  | a Signal. | 
|  | * Blocking for Handler::                Blocking additional signals while a | 
|  | handler is being run. | 
|  | * Checking for Pending Signals::        Checking for Pending Signals | 
|  | * Remembering a Signal::                How you can get almost the same | 
|  | effect as blocking a signal, by | 
|  | handling it and setting a flag | 
|  | to be tested later. | 
|  | @end menu | 
|  |  | 
|  | @node Why Block | 
|  | @subsection Why Blocking Signals is Useful | 
|  |  | 
|  | Temporary blocking of signals with @code{sigprocmask} gives you a way to | 
|  | prevent interrupts during critical parts of your code.  If signals | 
|  | arrive in that part of the program, they are delivered later, after you | 
|  | unblock them. | 
|  |  | 
|  | One example where this is useful is for sharing data between a signal | 
|  | handler and the rest of the program.  If the type of the data is not | 
|  | @code{sig_atomic_t} (@pxref{Atomic Data Access}), then the signal | 
|  | handler could run when the rest of the program has only half finished | 
|  | reading or writing the data.  This would lead to confusing consequences. | 
|  |  | 
|  | To make the program reliable, you can prevent the signal handler from | 
|  | running while the rest of the program is examining or modifying that | 
|  | data---by blocking the appropriate signal around the parts of the | 
|  | program that touch the data. | 
|  |  | 
|  | Blocking signals is also necessary when you want to perform a certain | 
|  | action only if a signal has not arrived.  Suppose that the handler for | 
|  | the signal sets a flag of type @code{sig_atomic_t}; you would like to | 
|  | test the flag and perform the action if the flag is not set.  This is | 
|  | unreliable.  Suppose the signal is delivered immediately after you test | 
|  | the flag, but before the consequent action: then the program will | 
|  | perform the action even though the signal has arrived. | 
|  |  | 
|  | The only way to test reliably for whether a signal has yet arrived is to | 
|  | test while the signal is blocked. | 
|  |  | 
|  | @node Signal Sets | 
|  | @subsection Signal Sets | 
|  |  | 
|  | All of the signal blocking functions use a data structure called a | 
|  | @dfn{signal set} to specify what signals are affected.  Thus, every | 
|  | activity involves two stages: creating the signal set, and then passing | 
|  | it as an argument to a library function. | 
|  | @cindex signal set | 
|  |  | 
|  | These facilities are declared in the header file @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftp {Data Type} sigset_t | 
|  | The @code{sigset_t} data type is used to represent a signal set. | 
|  | Internally, it may be implemented as either an integer or structure | 
|  | type. | 
|  |  | 
|  | For portability, use only the functions described in this section to | 
|  | initialize, change, and retrieve information from @code{sigset_t} | 
|  | objects---don't try to manipulate them directly. | 
|  | @end deftp | 
|  |  | 
|  | There are two ways to initialize a signal set.  You can initially | 
|  | specify it to be empty with @code{sigemptyset} and then add specified | 
|  | signals individually.  Or you can specify it to be full with | 
|  | @code{sigfillset} and then delete specified signals individually. | 
|  |  | 
|  | You must always initialize the signal set with one of these two | 
|  | functions before using it in any other way.  Don't try to set all the | 
|  | signals explicitly because the @code{sigset_t} object might include some | 
|  | other information (like a version field) that needs to be initialized as | 
|  | well.  (In addition, it's not wise to put into your program an | 
|  | assumption that the system has no signals aside from the ones you know | 
|  | about.) | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigemptyset (sigset_t *@var{set}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c Just memsets all of set to zero. | 
|  | This function initializes the signal set @var{set} to exclude all of the | 
|  | defined signals.  It always returns @code{0}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigfillset (sigset_t *@var{set}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | This function initializes the signal set @var{set} to include | 
|  | all of the defined signals.  Again, the return value is @code{0}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigaddset (sigset_t *@var{set}, int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | This function adds the signal @var{signum} to the signal set @var{set}. | 
|  | All @code{sigaddset} does is modify @var{set}; it does not block or | 
|  | unblock any signals. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure. | 
|  | The following @code{errno} error condition is defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The @var{signum} argument doesn't specify a valid signal. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigdelset (sigset_t *@var{set}, int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | This function removes the signal @var{signum} from the signal set | 
|  | @var{set}.  All @code{sigdelset} does is modify @var{set}; it does not | 
|  | block or unblock any signals.  The return value and error conditions are | 
|  | the same as for @code{sigaddset}. | 
|  | @end deftypefun | 
|  |  | 
|  | Finally, there is a function to test what signals are in a signal set: | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigismember (const sigset_t *@var{set}, int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | The @code{sigismember} function tests whether the signal @var{signum} is | 
|  | a member of the signal set @var{set}.  It returns @code{1} if the signal | 
|  | is in the set, @code{0} if not, and @code{-1} if there is an error. | 
|  |  | 
|  | The following @code{errno} error condition is defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The @var{signum} argument doesn't specify a valid signal. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @node Process Signal Mask | 
|  | @subsection Process Signal Mask | 
|  | @cindex signal mask | 
|  | @cindex process signal mask | 
|  |  | 
|  | The collection of signals that are currently blocked is called the | 
|  | @dfn{signal mask}.  Each process has its own signal mask.  When you | 
|  | create a new process (@pxref{Creating a Process}), it inherits its | 
|  | parent's mask.  You can block or unblock signals with total flexibility | 
|  | by modifying the signal mask. | 
|  |  | 
|  | The prototype for the @code{sigprocmask} function is in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | Note that you must not use @code{sigprocmask} in multi-threaded processes, | 
|  | because each thread has its own signal mask and there is no single process | 
|  | signal mask.  According to POSIX, the behavior of @code{sigprocmask} in a | 
|  | multi-threaded process is ``unspecified''. | 
|  | Instead, use @code{pthread_sigmask}. | 
|  | @ifset linuxthreads | 
|  | @xref{Threads and Signal Handling}. | 
|  | @end ifset | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigprocmask (int @var{how}, const sigset_t *restrict @var{set}, sigset_t *restrict @var{oldset}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/bsd(SIG_UNBLOCK)}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c This takes the hurd_self_sigstate-returned object's lock on HURD.  On | 
|  | @c BSD, SIG_UNBLOCK is emulated with two sigblock calls, which | 
|  | @c introduces a race window. | 
|  | The @code{sigprocmask} function is used to examine or change the calling | 
|  | process's signal mask.  The @var{how} argument determines how the signal | 
|  | mask is changed, and must be one of the following values: | 
|  |  | 
|  | @table @code | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @vindex SIG_BLOCK | 
|  | @item SIG_BLOCK | 
|  | Block the signals in @code{set}---add them to the existing mask.  In | 
|  | other words, the new mask is the union of the existing mask and | 
|  | @var{set}. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @vindex SIG_UNBLOCK | 
|  | @item SIG_UNBLOCK | 
|  | Unblock the signals in @var{set}---remove them from the existing mask. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @vindex SIG_SETMASK | 
|  | @item SIG_SETMASK | 
|  | Use @var{set} for the mask; ignore the previous value of the mask. | 
|  | @end table | 
|  |  | 
|  | The last argument, @var{oldset}, is used to return information about the | 
|  | old process signal mask.  If you just want to change the mask without | 
|  | looking at it, pass a null pointer as the @var{oldset} argument. | 
|  | Similarly, if you want to know what's in the mask without changing it, | 
|  | pass a null pointer for @var{set} (in this case the @var{how} argument | 
|  | is not significant).  The @var{oldset} argument is often used to | 
|  | remember the previous signal mask in order to restore it later.  (Since | 
|  | the signal mask is inherited over @code{fork} and @code{exec} calls, you | 
|  | can't predict what its contents are when your program starts running.) | 
|  |  | 
|  | If invoking @code{sigprocmask} causes any pending signals to be | 
|  | unblocked, at least one of those signals is delivered to the process | 
|  | before @code{sigprocmask} returns.  The order in which pending signals | 
|  | are delivered is not specified, but you can control the order explicitly | 
|  | by making multiple @code{sigprocmask} calls to unblock various signals | 
|  | one at a time. | 
|  |  | 
|  | The @code{sigprocmask} function returns @code{0} if successful, and @code{-1} | 
|  | to indicate an error.  The following @code{errno} error conditions are | 
|  | defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The @var{how} argument is invalid. | 
|  | @end table | 
|  |  | 
|  | You can't block the @code{SIGKILL} and @code{SIGSTOP} signals, but | 
|  | if the signal set includes these, @code{sigprocmask} just ignores | 
|  | them instead of returning an error status. | 
|  |  | 
|  | Remember, too, that blocking program error signals such as @code{SIGFPE} | 
|  | leads to undesirable results for signals generated by an actual program | 
|  | error (as opposed to signals sent with @code{raise} or @code{kill}). | 
|  | This is because your program may be too broken to be able to continue | 
|  | executing to a point where the signal is unblocked again. | 
|  | @xref{Program Error Signals}. | 
|  | @end deftypefun | 
|  |  | 
|  | @node Testing for Delivery | 
|  | @subsection Blocking to Test for Delivery of a Signal | 
|  |  | 
|  | Now for a simple example.  Suppose you establish a handler for | 
|  | @code{SIGALRM} signals that sets a flag whenever a signal arrives, and | 
|  | your main program checks this flag from time to time and then resets it. | 
|  | You can prevent additional @code{SIGALRM} signals from arriving in the | 
|  | meantime by wrapping the critical part of the code with calls to | 
|  | @code{sigprocmask}, like this: | 
|  |  | 
|  | @smallexample | 
|  | /* @r{This variable is set by the SIGALRM signal handler.} */ | 
|  | volatile sig_atomic_t flag = 0; | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | @{ | 
|  | sigset_t block_alarm; | 
|  |  | 
|  | @dots{} | 
|  |  | 
|  | /* @r{Initialize the signal mask.} */ | 
|  | sigemptyset (&block_alarm); | 
|  | sigaddset (&block_alarm, SIGALRM); | 
|  |  | 
|  | @group | 
|  | while (1) | 
|  | @{ | 
|  | /* @r{Check if a signal has arrived; if so, reset the flag.} */ | 
|  | sigprocmask (SIG_BLOCK, &block_alarm, NULL); | 
|  | if (flag) | 
|  | @{ | 
|  | @var{actions-if-not-arrived} | 
|  | flag = 0; | 
|  | @} | 
|  | sigprocmask (SIG_UNBLOCK, &block_alarm, NULL); | 
|  |  | 
|  | @dots{} | 
|  | @} | 
|  | @} | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | @node Blocking for Handler | 
|  | @subsection Blocking Signals for a Handler | 
|  | @cindex blocking signals, in a handler | 
|  |  | 
|  | When a signal handler is invoked, you usually want it to be able to | 
|  | finish without being interrupted by another signal.  From the moment the | 
|  | handler starts until the moment it finishes, you must block signals that | 
|  | might confuse it or corrupt its data. | 
|  |  | 
|  | When a handler function is invoked on a signal, that signal is | 
|  | automatically blocked (in addition to any other signals that are already | 
|  | in the process's signal mask) during the time the handler is running. | 
|  | If you set up a handler for @code{SIGTSTP}, for instance, then the | 
|  | arrival of that signal forces further @code{SIGTSTP} signals to wait | 
|  | during the execution of the handler. | 
|  |  | 
|  | However, by default, other kinds of signals are not blocked; they can | 
|  | arrive during handler execution. | 
|  |  | 
|  | The reliable way to block other kinds of signals during the execution of | 
|  | the handler is to use the @code{sa_mask} member of the @code{sigaction} | 
|  | structure. | 
|  |  | 
|  | Here is an example: | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  | #include <stddef.h> | 
|  |  | 
|  | void catch_stop (); | 
|  |  | 
|  | void | 
|  | install_handler (void) | 
|  | @{ | 
|  | struct sigaction setup_action; | 
|  | sigset_t block_mask; | 
|  |  | 
|  | sigemptyset (&block_mask); | 
|  | /* @r{Block other terminal-generated signals while handler runs.} */ | 
|  | sigaddset (&block_mask, SIGINT); | 
|  | sigaddset (&block_mask, SIGQUIT); | 
|  | setup_action.sa_handler = catch_stop; | 
|  | setup_action.sa_mask = block_mask; | 
|  | setup_action.sa_flags = 0; | 
|  | sigaction (SIGTSTP, &setup_action, NULL); | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | This is more reliable than blocking the other signals explicitly in the | 
|  | code for the handler.  If you block signals explicitly in the handler, | 
|  | you can't avoid at least a short interval at the beginning of the | 
|  | handler where they are not yet blocked. | 
|  |  | 
|  | You cannot remove signals from the process's current mask using this | 
|  | mechanism.  However, you can make calls to @code{sigprocmask} within | 
|  | your handler to block or unblock signals as you wish. | 
|  |  | 
|  | In any case, when the handler returns, the system restores the mask that | 
|  | was in place before the handler was entered.  If any signals that become | 
|  | unblocked by this restoration are pending, the process will receive | 
|  | those signals immediately, before returning to the code that was | 
|  | interrupted. | 
|  |  | 
|  | @node Checking for Pending Signals | 
|  | @subsection Checking for Pending Signals | 
|  | @cindex pending signals, checking for | 
|  | @cindex blocked signals, checking for | 
|  | @cindex checking for pending signals | 
|  |  | 
|  | You can find out which signals are pending at any time by calling | 
|  | @code{sigpending}.  This function is declared in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigpending (sigset_t *@var{set}) | 
|  | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c Direct rt_sigpending syscall on most systems.  On hurd, calls | 
|  | @c hurd_self_sigstate, it copies the sigstate's pending while holding | 
|  | @c its lock. | 
|  | The @code{sigpending} function stores information about pending signals | 
|  | in @var{set}.  If there is a pending signal that is blocked from | 
|  | delivery, then that signal is a member of the returned set.  (You can | 
|  | test whether a particular signal is a member of this set using | 
|  | @code{sigismember}; see @ref{Signal Sets}.) | 
|  |  | 
|  | The return value is @code{0} if successful, and @code{-1} on failure. | 
|  | @end deftypefun | 
|  |  | 
|  | Testing whether a signal is pending is not often useful.  Testing when | 
|  | that signal is not blocked is almost certainly bad design. | 
|  |  | 
|  | Here is an example. | 
|  |  | 
|  | @smallexample | 
|  | #include <signal.h> | 
|  | #include <stddef.h> | 
|  |  | 
|  | sigset_t base_mask, waiting_mask; | 
|  |  | 
|  | sigemptyset (&base_mask); | 
|  | sigaddset (&base_mask, SIGINT); | 
|  | sigaddset (&base_mask, SIGTSTP); | 
|  |  | 
|  | /* @r{Block user interrupts while doing other processing.} */ | 
|  | sigprocmask (SIG_SETMASK, &base_mask, NULL); | 
|  | @dots{} | 
|  |  | 
|  | /* @r{After a while, check to see whether any signals are pending.} */ | 
|  | sigpending (&waiting_mask); | 
|  | if (sigismember (&waiting_mask, SIGINT)) @{ | 
|  | /* @r{User has tried to kill the process.} */ | 
|  | @} | 
|  | else if (sigismember (&waiting_mask, SIGTSTP)) @{ | 
|  | /* @r{User has tried to stop the process.} */ | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | Remember that if there is a particular signal pending for your process, | 
|  | additional signals of that same type that arrive in the meantime might | 
|  | be discarded.  For example, if a @code{SIGINT} signal is pending when | 
|  | another @code{SIGINT} signal arrives, your program will probably only | 
|  | see one of them when you unblock this signal. | 
|  |  | 
|  | @strong{Portability Note:} The @code{sigpending} function is new in | 
|  | POSIX.1.  Older systems have no equivalent facility. | 
|  |  | 
|  | @node Remembering a Signal | 
|  | @subsection Remembering a Signal to Act On Later | 
|  |  | 
|  | Instead of blocking a signal using the library facilities, you can get | 
|  | almost the same results by making the handler set a flag to be tested | 
|  | later, when you ``unblock''.  Here is an example: | 
|  |  | 
|  | @smallexample | 
|  | /* @r{If this flag is nonzero, don't handle the signal right away.} */ | 
|  | volatile sig_atomic_t signal_pending; | 
|  |  | 
|  | /* @r{This is nonzero if a signal arrived and was not handled.} */ | 
|  | volatile sig_atomic_t defer_signal; | 
|  |  | 
|  | void | 
|  | handler (int signum) | 
|  | @{ | 
|  | if (defer_signal) | 
|  | signal_pending = signum; | 
|  | else | 
|  | @dots{} /* @r{``Really'' handle the signal.} */ | 
|  | @} | 
|  |  | 
|  | @dots{} | 
|  |  | 
|  | void | 
|  | update_mumble (int frob) | 
|  | @{ | 
|  | /* @r{Prevent signals from having immediate effect.} */ | 
|  | defer_signal++; | 
|  | /* @r{Now update @code{mumble}, without worrying about interruption.} */ | 
|  | mumble.a = 1; | 
|  | mumble.b = hack (); | 
|  | mumble.c = frob; | 
|  | /* @r{We have updated @code{mumble}.  Handle any signal that came in.} */ | 
|  | defer_signal--; | 
|  | if (defer_signal == 0 && signal_pending != 0) | 
|  | raise (signal_pending); | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | Note how the particular signal that arrives is stored in | 
|  | @code{signal_pending}.  That way, we can handle several types of | 
|  | inconvenient signals with the same mechanism. | 
|  |  | 
|  | We increment and decrement @code{defer_signal} so that nested critical | 
|  | sections will work properly; thus, if @code{update_mumble} were called | 
|  | with @code{signal_pending} already nonzero, signals would be deferred | 
|  | not only within @code{update_mumble}, but also within the caller.  This | 
|  | is also why we do not check @code{signal_pending} if @code{defer_signal} | 
|  | is still nonzero. | 
|  |  | 
|  | The incrementing and decrementing of @code{defer_signal} each require more | 
|  | than one instruction; it is possible for a signal to happen in the | 
|  | middle.  But that does not cause any problem.  If the signal happens | 
|  | early enough to see the value from before the increment or decrement, | 
|  | that is equivalent to a signal which came before the beginning of the | 
|  | increment or decrement, which is a case that works properly. | 
|  |  | 
|  | It is absolutely vital to decrement @code{defer_signal} before testing | 
|  | @code{signal_pending}, because this avoids a subtle bug.  If we did | 
|  | these things in the other order, like this, | 
|  |  | 
|  | @smallexample | 
|  | if (defer_signal == 1 && signal_pending != 0) | 
|  | raise (signal_pending); | 
|  | defer_signal--; | 
|  | @end smallexample | 
|  |  | 
|  | @noindent | 
|  | then a signal arriving in between the @code{if} statement and the decrement | 
|  | would be effectively ``lost'' for an indefinite amount of time.  The | 
|  | handler would merely set @code{defer_signal}, but the program having | 
|  | already tested this variable, it would not test the variable again. | 
|  |  | 
|  | @cindex timing error in signal handling | 
|  | Bugs like these are called @dfn{timing errors}.  They are especially bad | 
|  | because they happen only rarely and are nearly impossible to reproduce. | 
|  | You can't expect to find them with a debugger as you would find a | 
|  | reproducible bug.  So it is worth being especially careful to avoid | 
|  | them. | 
|  |  | 
|  | (You would not be tempted to write the code in this order, given the use | 
|  | of @code{defer_signal} as a counter which must be tested along with | 
|  | @code{signal_pending}.  After all, testing for zero is cleaner than | 
|  | testing for one.  But if you did not use @code{defer_signal} as a | 
|  | counter, and gave it values of zero and one only, then either order | 
|  | might seem equally simple.  This is a further advantage of using a | 
|  | counter for @code{defer_signal}: it will reduce the chance you will | 
|  | write the code in the wrong order and create a subtle bug.) | 
|  |  | 
|  | @node Waiting for a Signal | 
|  | @section Waiting for a Signal | 
|  | @cindex waiting for a signal | 
|  | @cindex @code{pause} function | 
|  |  | 
|  | If your program is driven by external events, or uses signals for | 
|  | synchronization, then when it has nothing to do it should probably wait | 
|  | until a signal arrives. | 
|  |  | 
|  | @menu | 
|  | * Using Pause::                 The simple way, using @code{pause}. | 
|  | * Pause Problems::              Why the simple way is often not very good. | 
|  | * Sigsuspend::                  Reliably waiting for a specific signal. | 
|  | @end menu | 
|  |  | 
|  | @node Using Pause | 
|  | @subsection Using @code{pause} | 
|  |  | 
|  | The simple way to wait until a signal arrives is to call @code{pause}. | 
|  | Please read about its disadvantages, in the following section, before | 
|  | you use it. | 
|  |  | 
|  | @comment unistd.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int pause (void) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c  The signal mask read by sigprocmask may be overridden by another | 
|  | @c  thread or by a signal handler before we call sigsuspend.  Is this a | 
|  | @c  safety issue?  Probably not. | 
|  | @c pause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | @c [ports/linux/generic] | 
|  | @c  syscall_pause ok | 
|  | @c [posix] | 
|  | @c  sigemptyset dup ok | 
|  | @c  sigprocmask(SIG_BLOCK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] | 
|  | @c  sigsuspend dup @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | The @code{pause} function suspends program execution until a signal | 
|  | arrives whose action is either to execute a handler function, or to | 
|  | terminate the process. | 
|  |  | 
|  | If the signal causes a handler function to be executed, then | 
|  | @code{pause} returns.  This is considered an unsuccessful return (since | 
|  | ``successful'' behavior would be to suspend the program forever), so the | 
|  | return value is @code{-1}.  Even if you specify that other primitives | 
|  | should resume when a system handler returns (@pxref{Interrupted | 
|  | Primitives}), this has no effect on @code{pause}; it always fails when a | 
|  | signal is handled. | 
|  |  | 
|  | The following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINTR | 
|  | The function was interrupted by delivery of a signal. | 
|  | @end table | 
|  |  | 
|  | If the signal causes program termination, @code{pause} doesn't return | 
|  | (obviously). | 
|  |  | 
|  | This function is a cancellation point in multithreaded programs.  This | 
|  | is a problem if the thread allocates some resources (like memory, file | 
|  | descriptors, semaphores or whatever) at the time @code{pause} is | 
|  | called.  If the thread gets cancelled these resources stay allocated | 
|  | until the program ends.  To avoid this calls to @code{pause} should be | 
|  | protected using cancellation handlers. | 
|  | @c ref pthread_cleanup_push / pthread_cleanup_pop | 
|  |  | 
|  | The @code{pause} function is declared in  @file{unistd.h}. | 
|  | @end deftypefun | 
|  |  | 
|  | @node Pause Problems | 
|  | @subsection Problems with @code{pause} | 
|  |  | 
|  | The simplicity of @code{pause} can conceal serious timing errors that | 
|  | can make a program hang mysteriously. | 
|  |  | 
|  | It is safe to use @code{pause} if the real work of your program is done | 
|  | by the signal handlers themselves, and the ``main program'' does nothing | 
|  | but call @code{pause}.  Each time a signal is delivered, the handler | 
|  | will do the next batch of work that is to be done, and then return, so | 
|  | that the main loop of the program can call @code{pause} again. | 
|  |  | 
|  | You can't safely use @code{pause} to wait until one more signal arrives, | 
|  | and then resume real work.  Even if you arrange for the signal handler | 
|  | to cooperate by setting a flag, you still can't use @code{pause} | 
|  | reliably.  Here is an example of this problem: | 
|  |  | 
|  | @smallexample | 
|  | /* @r{@code{usr_interrupt} is set by the signal handler.}  */ | 
|  | if (!usr_interrupt) | 
|  | pause (); | 
|  |  | 
|  | /* @r{Do work once the signal arrives.}  */ | 
|  | @dots{} | 
|  | @end smallexample | 
|  |  | 
|  | @noindent | 
|  | This has a bug: the signal could arrive after the variable | 
|  | @code{usr_interrupt} is checked, but before the call to @code{pause}. | 
|  | If no further signals arrive, the process would never wake up again. | 
|  |  | 
|  | You can put an upper limit on the excess waiting by using @code{sleep} | 
|  | in a loop, instead of using @code{pause}.  (@xref{Sleeping}, for more | 
|  | about @code{sleep}.)  Here is what this looks like: | 
|  |  | 
|  | @smallexample | 
|  | /* @r{@code{usr_interrupt} is set by the signal handler.} | 
|  | while (!usr_interrupt) | 
|  | sleep (1); | 
|  |  | 
|  | /* @r{Do work once the signal arrives.}  */ | 
|  | @dots{} | 
|  | @end smallexample | 
|  |  | 
|  | For some purposes, that is good enough.  But with a little more | 
|  | complexity, you can wait reliably until a particular signal handler is | 
|  | run, using @code{sigsuspend}. | 
|  | @ifinfo | 
|  | @xref{Sigsuspend}. | 
|  | @end ifinfo | 
|  |  | 
|  | @node Sigsuspend | 
|  | @subsection Using @code{sigsuspend} | 
|  |  | 
|  | The clean and reliable way to wait for a signal to arrive is to block it | 
|  | and then use @code{sigsuspend}.  By using @code{sigsuspend} in a loop, | 
|  | you can wait for certain kinds of signals, while letting other kinds of | 
|  | signals be handled by their handlers. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int sigsuspend (const sigset_t *@var{set}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c sigsuspend @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | @c [posix] @mtasurace:sigprocmask/!bsd!linux | 
|  | @c   saving and restoring the procmask is racy | 
|  | @c  sigprocmask(SIG_SETMASK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] | 
|  | @c  pause @asulock/hurd @aculock/hurd | 
|  | @c [bsd] | 
|  | @c  sigismember dup ok | 
|  | @c  sigmask dup ok | 
|  | @c  sigpause dup ok [no @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd] | 
|  | @c [linux] | 
|  | @c  do_sigsuspend ok | 
|  | This function replaces the process's signal mask with @var{set} and then | 
|  | suspends the process until a signal is delivered whose action is either | 
|  | to terminate the process or invoke a signal handling function.  In other | 
|  | words, the program is effectively suspended until one of the signals that | 
|  | is not a member of @var{set} arrives. | 
|  |  | 
|  | If the process is woken up by delivery of a signal that invokes a handler | 
|  | function, and the handler function returns, then @code{sigsuspend} also | 
|  | returns. | 
|  |  | 
|  | The mask remains @var{set} only as long as @code{sigsuspend} is waiting. | 
|  | The function @code{sigsuspend} always restores the previous signal mask | 
|  | when it returns. | 
|  |  | 
|  | The return value and error conditions are the same as for @code{pause}. | 
|  | @end deftypefun | 
|  |  | 
|  | With @code{sigsuspend}, you can replace the @code{pause} or @code{sleep} | 
|  | loop in the previous section with something completely reliable: | 
|  |  | 
|  | @smallexample | 
|  | sigset_t mask, oldmask; | 
|  |  | 
|  | @dots{} | 
|  |  | 
|  | /* @r{Set up the mask of signals to temporarily block.} */ | 
|  | sigemptyset (&mask); | 
|  | sigaddset (&mask, SIGUSR1); | 
|  |  | 
|  | @dots{} | 
|  |  | 
|  | /* @r{Wait for a signal to arrive.} */ | 
|  | sigprocmask (SIG_BLOCK, &mask, &oldmask); | 
|  | while (!usr_interrupt) | 
|  | sigsuspend (&oldmask); | 
|  | sigprocmask (SIG_UNBLOCK, &mask, NULL); | 
|  | @end smallexample | 
|  |  | 
|  | This last piece of code is a little tricky.  The key point to remember | 
|  | here is that when @code{sigsuspend} returns, it resets the process's | 
|  | signal mask to the original value, the value from before the call to | 
|  | @code{sigsuspend}---in this case, the @code{SIGUSR1} signal is once | 
|  | again blocked.  The second call to @code{sigprocmask} is | 
|  | necessary to explicitly unblock this signal. | 
|  |  | 
|  | One other point: you may be wondering why the @code{while} loop is | 
|  | necessary at all, since the program is apparently only waiting for one | 
|  | @code{SIGUSR1} signal.  The answer is that the mask passed to | 
|  | @code{sigsuspend} permits the process to be woken up by the delivery of | 
|  | other kinds of signals, as well---for example, job control signals.  If | 
|  | the process is woken up by a signal that doesn't set | 
|  | @code{usr_interrupt}, it just suspends itself again until the ``right'' | 
|  | kind of signal eventually arrives. | 
|  |  | 
|  | This technique takes a few more lines of preparation, but that is needed | 
|  | just once for each kind of wait criterion you want to use.  The code | 
|  | that actually waits is just four lines. | 
|  |  | 
|  | @node Signal Stack | 
|  | @section Using a Separate Signal Stack | 
|  |  | 
|  | A signal stack is a special area of memory to be used as the execution | 
|  | stack during signal handlers.  It should be fairly large, to avoid any | 
|  | danger that it will overflow in turn; the macro @code{SIGSTKSZ} is | 
|  | defined to a canonical size for signal stacks.  You can use | 
|  | @code{malloc} to allocate the space for the stack.  Then call | 
|  | @code{sigaltstack} or @code{sigstack} to tell the system to use that | 
|  | space for the signal stack. | 
|  |  | 
|  | You don't need to write signal handlers differently in order to use a | 
|  | signal stack.  Switching from one stack to the other happens | 
|  | automatically.  (Some non-GNU debuggers on some machines may get | 
|  | confused if you examine a stack trace while a handler that uses the | 
|  | signal stack is running.) | 
|  |  | 
|  | There are two interfaces for telling the system to use a separate signal | 
|  | stack.  @code{sigstack} is the older interface, which comes from 4.2 | 
|  | BSD.  @code{sigaltstack} is the newer interface, and comes from 4.4 | 
|  | BSD.  The @code{sigaltstack} interface has the advantage that it does | 
|  | not require your program to know which direction the stack grows, which | 
|  | depends on the specific machine and operating system. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment XPG | 
|  | @deftp {Data Type} stack_t | 
|  | This structure describes a signal stack.  It contains the following members: | 
|  |  | 
|  | @table @code | 
|  | @item void *ss_sp | 
|  | This points to the base of the signal stack. | 
|  |  | 
|  | @item size_t ss_size | 
|  | This is the size (in bytes) of the signal stack which @samp{ss_sp} points to. | 
|  | You should set this to however much space you allocated for the stack. | 
|  |  | 
|  | There are two macros defined in @file{signal.h} that you should use in | 
|  | calculating this size: | 
|  |  | 
|  | @vtable @code | 
|  | @item SIGSTKSZ | 
|  | This is the canonical size for a signal stack.  It is judged to be | 
|  | sufficient for normal uses. | 
|  |  | 
|  | @item MINSIGSTKSZ | 
|  | This is the amount of signal stack space the operating system needs just | 
|  | to implement signal delivery.  The size of a signal stack @strong{must} | 
|  | be greater than this. | 
|  |  | 
|  | For most cases, just using @code{SIGSTKSZ} for @code{ss_size} is | 
|  | sufficient.  But if you know how much stack space your program's signal | 
|  | handlers will need, you may want to use a different size.  In this case, | 
|  | you should allocate @code{MINSIGSTKSZ} additional bytes for the signal | 
|  | stack and increase @code{ss_size} accordingly. | 
|  | @end vtable | 
|  |  | 
|  | @item int ss_flags | 
|  | This field contains the bitwise @sc{or} of these flags: | 
|  |  | 
|  | @vtable @code | 
|  | @item SS_DISABLE | 
|  | This tells the system that it should not use the signal stack. | 
|  |  | 
|  | @item SS_ONSTACK | 
|  | This is set by the system, and indicates that the signal stack is | 
|  | currently in use.  If this bit is not set, then signals will be | 
|  | delivered on the normal user stack. | 
|  | @end vtable | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment signal.h | 
|  | @comment XPG | 
|  | @deftypefun int sigaltstack (const stack_t *restrict @var{stack}, stack_t *restrict @var{oldstack}) | 
|  | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c Syscall on Linux and BSD; the HURD implementation takes a lock on | 
|  | @c the hurd_self_sigstate-returned struct. | 
|  | The @code{sigaltstack} function specifies an alternate stack for use | 
|  | during signal handling.  When a signal is received by the process and | 
|  | its action indicates that the signal stack is used, the system arranges | 
|  | a switch to the currently installed signal stack while the handler for | 
|  | that signal is executed. | 
|  |  | 
|  | If @var{oldstack} is not a null pointer, information about the currently | 
|  | installed signal stack is returned in the location it points to.  If | 
|  | @var{stack} is not a null pointer, then this is installed as the new | 
|  | stack for use by signal handlers. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure.  If | 
|  | @code{sigaltstack} fails, it sets @code{errno} to one of these values: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | You tried to disable a stack that was in fact currently in use. | 
|  |  | 
|  | @item ENOMEM | 
|  | The size of the alternate stack was too small. | 
|  | It must be greater than @code{MINSIGSTKSZ}. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | Here is the older @code{sigstack} interface.  You should use | 
|  | @code{sigaltstack} instead on systems that have it. | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftp {Data Type} {struct sigstack} | 
|  | This structure describes a signal stack.  It contains the following members: | 
|  |  | 
|  | @table @code | 
|  | @item void *ss_sp | 
|  | This is the stack pointer.  If the stack grows downwards on your | 
|  | machine, this should point to the top of the area you allocated.  If the | 
|  | stack grows upwards, it should point to the bottom. | 
|  |  | 
|  | @item int ss_onstack | 
|  | This field is true if the process is currently using this stack. | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun int sigstack (struct sigstack *@var{stack}, struct sigstack *@var{oldstack}) | 
|  | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c Lossy and dangerous (no size limit) wrapper for sigaltstack. | 
|  | The @code{sigstack} function specifies an alternate stack for use during | 
|  | signal handling.  When a signal is received by the process and its | 
|  | action indicates that the signal stack is used, the system arranges a | 
|  | switch to the currently installed signal stack while the handler for | 
|  | that signal is executed. | 
|  |  | 
|  | If @var{oldstack} is not a null pointer, information about the currently | 
|  | installed signal stack is returned in the location it points to.  If | 
|  | @var{stack} is not a null pointer, then this is installed as the new | 
|  | stack for use by signal handlers. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure. | 
|  | @end deftypefun | 
|  |  | 
|  | @node BSD Signal Handling | 
|  | @section BSD Signal Handling | 
|  |  | 
|  | This section describes alternative signal handling functions derived | 
|  | from BSD Unix.  These facilities were an advance, in their time; today, | 
|  | they are mostly obsolete, and supported mainly for compatibility with | 
|  | BSD Unix. | 
|  |  | 
|  | There are many similarities between the BSD and POSIX signal handling | 
|  | facilities, because the POSIX facilities were inspired by the BSD | 
|  | facilities.  Besides having different names for all the functions to | 
|  | avoid conflicts, the main difference between the two is that BSD Unix | 
|  | represents signal masks as an @code{int} bit mask, rather than as a | 
|  | @code{sigset_t} object. | 
|  |  | 
|  | The BSD facilities are declared in @file{signal.h}. | 
|  | @pindex signal.h | 
|  |  | 
|  | @comment signal.h | 
|  | @comment XPG | 
|  | @deftypefun int siginterrupt (int @var{signum}, int @var{failflag}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasuconst{:@mtssigintr{}}}@asunsafe{}@acunsafe{@acucorrupt{}}} | 
|  | @c This calls sigaction twice, once to get the current sigaction for the | 
|  | @c specified signal, another to apply the flags change.  This could | 
|  | @c override the effects of a concurrent sigaction call.  It also | 
|  | @c modifies without any guards the global _sigintr variable, that | 
|  | @c bsd_signal reads from, and it may leave _sigintr modified without | 
|  | @c overriding the active handler if cancelled between the two | 
|  | @c operations. | 
|  | This function specifies which approach to use when certain primitives | 
|  | are interrupted by handling signal @var{signum}.  If @var{failflag} is | 
|  | false, signal @var{signum} restarts primitives.  If @var{failflag} is | 
|  | true, handling @var{signum} causes these primitives to fail with error | 
|  | code @code{EINTR}.  @xref{Interrupted Primitives}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefn Macro int sigmask (int @var{signum}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c This just shifts signum. | 
|  | This macro returns a signal mask that has the bit for signal @var{signum} | 
|  | set.  You can bitwise-OR the results of several calls to @code{sigmask} | 
|  | together to specify more than one signal.  For example, | 
|  |  | 
|  | @smallexample | 
|  | (sigmask (SIGTSTP) | sigmask (SIGSTOP) | 
|  | | sigmask (SIGTTIN) | sigmask (SIGTTOU)) | 
|  | @end smallexample | 
|  |  | 
|  | @noindent | 
|  | specifies a mask that includes all the job-control stop signals. | 
|  | @end deftypefn | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun int sigblock (int @var{mask}) | 
|  | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c On most POSIX systems, this is a wrapper for sigprocmask(SIG_BLOCK). | 
|  | @c The exception are BSD systems other than 4.4, where it is a syscall. | 
|  | @c sigblock @asulock/hurd @aculock/hurd | 
|  | @c  sigprocmask(SIG_BLOCK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] | 
|  | This function is equivalent to @code{sigprocmask} (@pxref{Process Signal | 
|  | Mask}) with a @var{how} argument of @code{SIG_BLOCK}: it adds the | 
|  | signals specified by @var{mask} to the calling process's set of blocked | 
|  | signals.  The return value is the previous set of blocked signals. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun int sigsetmask (int @var{mask}) | 
|  | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c On most POSIX systems, this is a wrapper for sigprocmask(SIG_SETMASK). | 
|  | @c The exception are BSD systems other than 4.4, where it is a syscall. | 
|  | @c sigsetmask @asulock/hurd @aculock/hurd | 
|  | @c  sigprocmask(SIG_SETMASK) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] | 
|  | This function equivalent to @code{sigprocmask} (@pxref{Process | 
|  | Signal Mask}) with a @var{how} argument of @code{SIG_SETMASK}: it sets | 
|  | the calling process's signal mask to @var{mask}.  The return value is | 
|  | the previous set of blocked signals. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment signal.h | 
|  | @comment BSD | 
|  | @deftypefun int sigpause (int @var{mask}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:sigprocmask/!bsd!linux}}@asunsafe{@asulock{/hurd}}@acunsafe{@aculock{/hurd}}} | 
|  | @c sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | @c [posix] | 
|  | @c  __sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | @c   do_sigpause @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | @c    sigprocmask(0) dup @asulock/hurd @aculock/hurd [no @mtasurace:sigprocmask/bsd(SIG_UNBLOCK)] | 
|  | @c    sigdelset dup ok | 
|  | @c    sigset_set_old_mask dup ok | 
|  | @c    sigsuspend dup @mtasurace:sigprocmask/!bsd!linux @asulock/hurd @aculock/hurd | 
|  | This function is the equivalent of @code{sigsuspend} (@pxref{Waiting | 
|  | for a Signal}):  it sets the calling process's signal mask to @var{mask}, | 
|  | and waits for a signal to arrive.  On return the previous set of blocked | 
|  | signals is restored. | 
|  | @end deftypefun |