Skip to content

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

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

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.