using kevent to catch signals

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

using kevent to catch signals

Edgar Pettijohn III-2
I'm having trouble using kevent(2) to catch signals. Below is a sample
program. It should catch SIGHUP and SIGUSR1 and just print it out.
Instead when i send the process sighup with `kill -SIGHUP $PID` it
exits and the word Hangup is writtin to the terminal. If I use
`kill -SIGUSR1 $PID` the process exits and the words User defined signal 1
are written to the terminal. What am I doing wrong?

Thanks!

Edgar

sig.c (1005 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: using kevent to catch signals

Sebastien Marie-3
On Thu, Feb 18, 2021 at 10:23:05PM -0600, Edgar Pettijohn wrote:
> I'm having trouble using kevent(2) to catch signals. Below is a sample
> program. It should catch SIGHUP and SIGUSR1 and just print it out.
> Instead when i send the process sighup with `kill -SIGHUP $PID` it
> exits and the word Hangup is writtin to the terminal. If I use
> `kill -SIGUSR1 $PID` the process exits and the words User defined signal 1
> are written to the terminal. What am I doing wrong?

to quote kqueue(2) man page about signals:

   [EVFILT_SIGNAL] coexists with the signal(3) and sigaction(2)
   facilities, and has a lower precedence.  The filter will record all
   attempts to deliver a signal to a process, even if the signal has
   been marked as SIG_IGN.  Event notification happens after normal
   signal delivery processing.

and to quote signal(3) man page about default action:

     Name         Default Action       Description
   SIGHUP       terminate process    terminal line hangup
   SIGUSR1      terminate process    user-defined signal 1

Your program needs to first ignore SIGHUP and SIGUSR1 (so the process
will not terminate). This way, the kqueue(2) subsystem should be able
to process them correctly.

Thanks.
--
Sebastien Marie

Reply | Threaded
Open this post in threaded view
|

Re: using kevent to catch signals

Edgar Pettijohn III-2
On Fri, Feb 19, 2021 at 06:49:45AM +0100, Sebastien Marie wrote:

> On Thu, Feb 18, 2021 at 10:23:05PM -0600, Edgar Pettijohn wrote:
> > I'm having trouble using kevent(2) to catch signals. Below is a sample
> > program. It should catch SIGHUP and SIGUSR1 and just print it out.
> > Instead when i send the process sighup with `kill -SIGHUP $PID` it
> > exits and the word Hangup is writtin to the terminal. If I use
> > `kill -SIGUSR1 $PID` the process exits and the words User defined signal 1
> > are written to the terminal. What am I doing wrong?
>
> to quote kqueue(2) man page about signals:
>
>    [EVFILT_SIGNAL] coexists with the signal(3) and sigaction(2)
>    facilities, and has a lower precedence.  The filter will record all
>    attempts to deliver a signal to a process, even if the signal has
>    been marked as SIG_IGN.  Event notification happens after normal
>    signal delivery processing.

I read this and it just didn't click.

>
> and to quote signal(3) man page about default action:
>
>      Name         Default Action       Description
>    SIGHUP       terminate process    terminal line hangup
>    SIGUSR1      terminate process    user-defined signal 1
>
> Your program needs to first ignore SIGHUP and SIGUSR1 (so the process
> will not terminate). This way, the kqueue(2) subsystem should be able
> to process them correctly.
>
> Thanks.
> --
> Sebastien Marie

With the proper signal({SIGHUP,SIGUSR1}, SIG_IGN) calls it works as expected.

Thanks,

        Edgar