[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here HP C Run-Time Library Reference Manual for OpenVMS Systems

HP C
Run-Time Library Reference Manual for OpenVMS Systems


Previous Contents Index

A signal handler can be installed for more than one signal. Use the sigaction routine with the SA_RESETHAND flag to control this.

4.2.3 Signal-Handling Concepts

A signal is said to be generated for (or sent to) a process when the event that causes the signal first occurs. Examples of such events include detection of hardware faults, timer expiration, and terminal activity, as well as the invocation of kill . In some circumstances, the same event generates signals for multiple processes.

Each process has an action to be taken in response to each signal defined by the system. A signal is said to be delivered to a process when the appropriate action for the process and signal is taken.

During the time between the generation of a signal and its delivery, the signal is said to be pending. Ordinarily, this interval cannot be detected by an application. However, a signal can be blocked from delivery to a process:

  • If the action associated with a blocked signal is anything other than to ignore the signal, and if that signal is generated for the process, the signal remains pending until either it is unblocked or the action associated with it is set to ignore the signal.
  • If the action associated with a blocked signal is to ignore the signal and if that signal is generated for the process, it is unspecified whether the signal is discarded immediately upon generation or remains pending.

Each process has a signal mask that defines the set of signals currently blocked from delivery to it. The signal mask for a process is initialized from that of its parent. The sigaction , sigprocmask , and sigsuspend functions control the manipulation of the signal mask.

The determination of which action is taken in response to a signal is made at the time the signal is delivered, allowing for any changes since the time of generation. This determination is independent of the means by which the signal was originally generated. If a subsequent occurrence of a pending signal is generated, it is implementation-dependent as to whether the signal is delivered more than once. The HP C RTL delivers the signal only once. The order in which multiple, simultaneously pending signals are delivered to a process is unspecified.

4.2.4 Signal Actions

This section applies to the sigaction , signal , sigvec , and ssignal functions.

There are three types of action that can be associated with a signal:

SIG_DFL
SIG_IGN
pointer to a function

Initially, all signals are set to SIG_DFL or SIG_IGN prior to entry of the main routine (see the exec functions.) The actions prescribed by these values are:

SIG_DFL --- signal-specific default action
  • The default actions for the signals defined in this document are specified under <signal.h> .
  • If the default action is to stop the process, the execution of that process is temporarily suspended. When a process stops, a SIGCHLD signal is generated for its parent process, unless the parent process has set the SA_NOCLDSTOP flag. While a process is stopped, any additional signals that are sent to the process are not delivered until the process is continued, except SIGKILL which always terminates the receiving process. A process that is a member of an orphaned process group is not allowed to stop in response to the SIGSTOP, SIGTTIN, or SIGTTOU signals. In cases where delivery of one of these signals would stop such a process, the signal is discarded.
  • Setting a signal action to SIG_DFL for a signal that is pending and whose default action is to ignore the signal (for example, SIGCHLD), causes the pending signal to be discarded, whether or not it is blocked.


SIG_IGN --- ignore signal
  • Delivery of the signal has no effect on the process. The behavior of a process is undefined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by kill or raise .
  • The system does not allow the action for the SIGKILL or SIGSTOP signals to be set to SIG_IGN.
  • Setting a signal action to SIG_IGN for a signal that is pending causes the pending signal to be discarded, whether or not it is blocked.
  • If a process sets the action for the SIGCHLD signal to SIG_IGN, the behavior is unspecified.


pointer to a function --- catch signal
  • On delivery of the signal, the receiving process executes the signal-catching function at the specified address. After returning from the signal-catching function, the receiving process resumes execution at the point at which it was interrupted.
  • Specify the signal-catching function as:


    void func(int signo); 
    

    Here, func is the specified signal-catching function and signo is the signal number of the signal being delivered.
  • The behavior of a process is undefined after it returns normally from a signal-catching function for a SIGFPE, SIGKILL, or SIGSEGV signal that was not generated by kill or raise .
  • The system does not allow a process to catch the signals SIGKILL and SIGSTOP.
  • If a process establishes a signal-catching function for the SIGCHLD signal while it has a terminated child process for which it has not waited, it is unspecified whether a SIGCHLD signal is generated to indicate that child process.

4.2.5 Signal Handling and OpenVMS Exception Handling

This section discusses how HP C RTL signal handling is implemented with and interacts with OpenVMS exception handling. Information in this section allows you to write OpenVMS exception handlers that do not conflict with HP C RTL signal handling. For information on OpenVMS exception handling, see the OpenVMS Procedure Calling and Condition Handling Standard.

The HP C RTL implements signals with OpenVMS exceptions. When gsignal or raise is called, the signal number is translated to a particular OpenVMS exception, which is used in a call to LIB$SIGNAL. This mechanism is necessary to catch an OpenVMS exception resulting from a user error and translate it into a corresponding UNIX signal. For example, an ACCVIO resulting from a write to a NULL pointer is translated to a SIGBUS or SIGSEGV signal.

Tables 4-4 and 4-5 list the HP C RTL signal names, the corresponding OpenVMS Alpha and Integrity server system exceptions, the event that generates the signal, and the optional signal code for use with the gsignal and raise functions.

To call a signal handler that you have established with signal or sigvec , the HP C RTL intercepts the OpenVMS exceptions that correspond to signals by having an OpenVMS exception handler in the main routine of the program. If your program has a main function, then this exception handler is automatically established. If you do not have a main function, or if your main function is written in a language other than HP C, then you must invoke the VAXC$CRTL_INIT routine to establish this handler.

The HP C RTL uses OpenVMS exceptions to implement the setjmp and longjmp functions. When the longjmp function is called, a C$_LONGJMP OpenVMS exception is signaled. To prevent the C$_LONGJMP exception from being interfered with by user exception handlers, use the VAXC$ESTABLISH routine to establish user OpenVMS exception handlers instead of calling LIB$ESTABLISH. The C$_LONGJMP mnemonic is defined in the <errnodef.h> header file.

If you want to use OpenVMS exception handlers and UNIX signals in your C program, your OpenVMS exception handler must be prepared to accept and resignal the OpenVMS exceptions listed in Table 4-4 (ALPHA ONLY), as well as the C$_LONGJMP exception and any C$ facility exception that might be introduced in future versions of the HP C RTL. This is because UNIX signals are global in context, whereas OpenVMS exceptions are stack-frame based.

Consequently, an OpenVMS exception handler always receives the exception that corresponds to the UNIX signal before the HP C RTL exception handler in the main routine does. By resignaling the OpenVMS exception, you allow the HP C RTL exception handler to receive the exception. You can intercept any of those OpenVMS exceptions yourself, but in doing so you will disable the corresponding UNIX signal.

Table 4-4 HP C RTL Signals and Corresponding OpenVMS Alpha Exceptions (ALPHA ONLY)
Name OpenVMS Exception Generated By Code
SIGABRT SS$_OPCCUS The abort function --
SIGALRM SS$_ASTFLT The alarm function --
SIGBUS SS$_ACCVIO Access violation --
SIGBUS SS$_CMODUSER Change mode user --
SIGCHLD C$_SIGCHLD Child process stopped --
SIGEMT SS$_COMPAT Compatibility mode trap --
SIGFPE SS$_DECDIV Decimal divide trap FPE_DECDIV_TRAP
SIGFPE SS$_DECINV Decimal invalid operand trap FPE_DECINV_TRAP
SIGFPE SS$_DECOVF Decimal overflow trap FPE_DECOVF_TRAP
SIGFPE SS$_HPARITH Floating/decimal division by 0 FPE_FLTDIV_TRAP
SIGFPE SS$_HPARITH Floating overflow trap FPE_FLTOVF_TRAP
SIGFPE SS$_HPARITH Floating underflow trap FPE_FLTUND_TRAP
SIGFPE SS$_HPARITH Integer overflow FPE_INTOVF_TRAP
SIGFPE SS$_HPARITH Invalid operand FPE_INVOPR_TRAP
SIGFPE SS$_HPARITH Inexact result FPE_INXRES_TRAP
SIGFPE SS$_INTDIV Integer div by zero FPE_INTDIV_TRAP
SIGFPE SS$_SUBRNG Subscript out of range FPE_SUBRNG_TRAP
SIGFPE SS$_SUBRNG1 Subscript1 out of range FPE_SUBRNG1_TRAP
SIGFPE SS$_SUBRNG2 Subscript2 out of range FPE_SUBRNG2_TRAP
SIGFPE SS$_SUBRNG3 Subscript3 out of range FPE_SUBRNG3_TRAP
SIGFPE SS$_SUBRNG4 Subscript4 out of range FPE_SUBRNG4_TRAP
SIGFPE SS$_SUBRNG5 Subscript5 out of range FPE_SUBRNG5_TRAP
SIGFPE SS$_SUBRNG6 Subscript6 out of range FPE_SUBRNG6_TRAP
SIGFPE SS$_SUBRNG7 Subscript7 out of range FPE_SUBRNG7_TRAP
SIGHUP SS$_HANGUP Data set hangup --
SIGILL SS$_OPCDEC Reserved instruction ILL_PRIVIN_FAULT
SIGILL SS$_ROPRAND Reserved operand ILL_RESOP_FAULT
SIGINT SS$_CONTROLC OpenVMS Ctrl/C interrupt --
SIGIOT SS$_OPCCUS Customer-reserved opcode --
SIGKILL SS$_ABORT External signal only --
SIGQUIT SS$_CONTROLY The raise function --
SIGPIPE SS$_NOMBX No mailbox --
SIGPIPE C$_SIGPIPE Broken pipe --
SIGSEGV SS$_ACCVIO Length violation --
SIGSEGV SS$_CMODSUPR Change mode supervisor --
SIGSYS SS$_BADPARAM Bad argument to system call --
SIGTERM Not implemented -- --
SIGTRAP SS$_BREAK Breakpoint fault instruction --
SIGUSR1 C$_SIGUSR1 The raise function --
SIGUSR2 C$_SIGUSR2 The raise function --
SIGWINCH 1 C$_SIGWINCH 2 The raise function --

1Supported on OpenVMS Version 7.3 and higher.
2SS$_BADWINCNT when C$_SIGWINCH not defined (OpenVMS versions before 7.3).

OpenVMS Alpha Signal-Handling Notes (ALPHA ONLY)

  • While all signals that exist on OpenVMS VAX systems also exist on OpenVMS Alpha systems, the corresponding OpenVMS exceptions and code is different in a number of cases because on Alpha processors there are two new OpenVMS exceptions and several others that are obsolete.
  • All floating-point exceptions on OpenVMS Alpha systems are signaled by the OpenVMS exception SS$_HPARITH (high-performance arithmetic trap). The particular type of trap that occurred is translated by the HP C RTL through use of the exception summary longword, which is set when a high-performance arithmetic trap is signaled.

Table 4-5 HP C RTL Signals and Corresponding OpenVMS Integrity server system Exceptions (INTEGRITY SERVERS ONLY)
Name OpenVMS Exception Generated By Code
SIGABRT SS$_OPCCUS The abort function --
SIGALRM SS$_ASTFLT The alarm function --
SIGBUS SS$_ACCVIO Access violation --
SIGBUS SS$_CMODUSER Change mode user --
SIGCHLD C$_SIGCHLD Child process stopped --
SIGEMT SS$_COMPAT Compatibility mode trap --
SIGFPE SS$_DECOVF Decimal overflow trap FPE_DECOVF_TRAP
SIGFPE SS$_DECDIV Decimal divide trap FPE_DECDIV_TRAP
SIGFPE SS$_DECINV Decimal invalid operand trap FPE_DECINV_TRAP
SIGFPE SS$_FLTDENORMAL Denormal operand fault FPE_FLTDENORMAL_FAULT
SIGFPE SS$_FLTDIV Floating/decimal division by 0 FPE_FLTDIV_TRAP
SIGFPE SS$_FLTDIV_F Floating divide by 0 fault FPE_FLTDIV_FAULT
SIGFPE SS$_FLTINE Inexact operation trap FPE_FLTINE_TRAP
SIGFPE SS$_FLTINV Invalid operation trap FPE_FLTINV_TRAP
SIGFPE SS$_FLTINV_F Invalid operation fault FPE_FLTINV_FAULT
SIGFPE SS$_FLTOVF Floating overflow trap FPE_FLTOVF_TRAP
SIGFPE SS$_FLTUND Floating underflow trap FPE_FLTUND_TRAP
SIGFPE SS$_INTDIV Integer division by 0 FPE_INTDIV_TRAP
SIGFPE SS$_INTOVF Integer overflow FPE_INTOVF_TRAP
SIGFPE SS$_SUBRNG Subscript-range FPE_SUBRNG_TRAP
SIGHUP SS$_HANGUP Data set hangup --
SIGILL SS$_OPCDEC Reserved instruction ILL_PRIVIN_FAULT
SIGILL SS$_ROPRAND Reserved operand ILL_RESOP_FAULT
SIGINT SS$_CONTROLC OpenVMS Ctrl/C interrupt --
SIGIOT SS$_OPCCUS Customer-reserved opcode --
SIGKILL SS$_ABORT External signal only --
SIGQUIT SS$_CONTROLY The raise function --
SIGPIPE SS$_NOMBX No mailbox --
SIGPIPE C$_SIGPIPE Broken pipe --
SIGSEGV SS$_ACCVIO Length violation --
SIGSEGV SS$_CMODSUPR Change mode supervisor --
SIGSYS SS$_BADPARAM Bad argument to system call --
SIGTERM Not implemented -- --
SIGTRAP SS$_TBIT TBIT trace trap --
SIGTRAP SS$_BREAK Breakpoint fault instruction --
SIGUSR1 C$_SIGUSR1 The raise function --
SIGUSR2 C$_SIGUSR2 The raise function --
SIGWINCH C$_SIGWINCH The raise function --


Previous Next Contents Index