[Overview][Constants][Types][Procedures and functions][Index] | Reference for unit 'BaseUnix' (#rtl)

# FPSigaction

Install signal handler

## Declaration

Source position: bunxh.inc line 95

`function FPSigaction(`
`sig: cint;`
`act: psigactionrec;`
`oact: psigactionrec`
`):cint;`

## Description

FPSigaction changes the action to take upon receipt of a signal. Act and Oact are pointers to a SigActionRec record. Sig specifies the signal, and can be any signal except SIGKILL or SIGSTOP.

If Act is non-nil, then the new action for signal Sig is taken from it. If OAct is non-nil, the old action is stored there. Sa_Handler may be SIG_DFL for the default action or SIG_IGN to ignore the signal. Sa_Mask Specifies which signals should be ignored during the execution of the signal handler. Sa_Flags Specifies a series of flags which modify the behaviour of the signal handler. You can 'or' none or more of the following :

SA_NOCLDSTOP
  If sig is SIGCHLD do not receive notification when child processes stop.
SA_ONESHOT or SA_RESETHAND
  Restore the signal action to the default state once the signal handler has been called.
SA_RESTART
  For compatibility with BSD signals.
SA_NOMASK or SA_NODEFER
  Do not prevent the signal from being received from within its own signal handler.

## Errors

Extended error information can be retrieved using fpGetErrno.

sys_einval
  an invalid signal was specified, or it was SIGKILL or SIGSTOP.
sys_efault
  Act,OldAct point outside this process address space
sys_eintr
  System call was interrupted.

## See also

FpSigProcMask |  | Set list of blocked signals
FpSigPending |  | Return set of currently pending signals
FpSigSuspend |  | Set signal mask and suspend process till signal is received
FpKill |  | Send a signal to a process

## Example

    Program example57;

    { Program to demonstrate the SigAction function.}

    {
    do a kill -USR1 pid from another terminal to see what happens.
    replace pid with the real pid of this program.
    You can get this pid by running 'ps'.
    }

    uses BaseUnix;

    Var
       oa,na : PSigActionRec;

    Procedure DoSig(sig : cint);cdecl;

    begin
       writeln('Receiving signal: ',sig);
    end;

    begin
       new(na);
       new(oa);
       na^.sa_Handler:=SigActionHandler(@DoSig);
       fillchar(na^.Sa_Mask,sizeof(na^.sa_mask),#0);
       na^.Sa_Flags:=0;
       {$ifdef Linux}               // Linux specific
         na^.Sa_Restorer:=Nil;
       {$endif}
       if fpSigAction(SigUsr1,na,oa)<>0 then
         begin
         writeln('Error: ',fpgeterrno,'.');
         halt(1);
         end;
       Writeln ('Send USR1 signal or press <ENTER> to exit');
       readln;
    end.

Documentation generated on: May 14 2021