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

FPSigaction

Install signal handler

Declaration

Source position: bunxh.inc line 91

function FPSigaction(

  sig: cInt;

  act: psigactionrec;

  oact: psigactionrec

):cInt;

Description

FPSigactionchanges the action to take upon receipt of a signal. Actand Oactare pointers to a SigActionRecrecord. Sigspecifies the signal, and can be any signal except SIGKILLor SIGSTOP.

If Actis non-nil, then the new action for signal Sigis taken from it. If OActis non-nil, the old action is stored there. Sa_Handlermay be SIG_DFLfor the default action or SIG_IGNto ignore the signal. Sa_MaskSpecifies which signals should be ignord during the execution of the signal handler. Sa_FlagsSpeciefies a series of flags which modify the behaviour of the signal handler. You can 'or' none or more of the following :

SA_NOCLDSTOP
If sigis SIGCHLDdo 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 SIGKILLor SIGSTOP.
sys_efault
Act,OldActpoint 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.