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.