Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which "fatal" signals should a user-level program catch?

First of all, I do know that there was a similar question here in the past.

But that question wasn't answered properly. Instead, it diverted into suggestion what to do to catch signals.

So just to clarify: I've done whatever needs to be done to handle signals. I have an application that forks a daemon that monitors the main process through pipe. If a main process crashes (e.g. segmentation fault), it has a signal handler that writes all the required info to pipe and aborts.

The goal is to have as much info as possible when something bad happens to the application, w/o messing with "normal" operation, such as SIGHUP, SIGUSR1, etc.

So my question is: which signals should I catch? I mean signals that w/o me catching them would cause application to abort anyway.

So far I've come up with the following list:

  • SIGINT (^C, user-initiated, but still good to know)
  • SIGTERM (kill <pid> from shell or, AFAIK, can be result of OutOfMemory)
  • SIGSEGV
  • SIGILL
  • SIGFPE
  • SIGBUS
  • SIGQUIT

Does anybody know if I miss something? kill -l has lots of them... :)

like image 625
kliteyn Avatar asked Nov 04 '12 13:11

kliteyn


People also ask

Which are the 2 signals that can be caught?

The SIGTERM signal is sent to a process to request its termination. Unlike the SIGKILL signal, it can be caught and interpreted or ignored by the process.

What triggers SIGKILL?

The system will generate SIGKILL for a process itself under some unusual conditions where the program cannot possibly continue to run (even to run a signal handler). The SIGHUP (“hang-up”) signal is used to report that the user's terminal is disconnected, perhaps because a network or telephone connection was broken.

In what cases does SIGKILL fail?

SIGKILL cannot be blocked or ignored ( SIGSTOP can't either). A process can become unresponsive to the signal if it is blocked "inside" a system call (waiting on I/O is one example - waiting on I/O on a failed NFS filesystem that is hard-mounted without the intr option for example).


1 Answers

I'm looking at my copy of advanced programming the unix environment (Stevens). According to the table in the section on signals, the following POSIX signals will by default terminate the process, if you don't catch them. It wouldn't be unreasonable to monitor all of these that you don't use:

  • SIGABRT
  • SIGALRM
  • SIGFPE
  • SIGHUP
  • SIGILL
  • SIGINT
  • SIGKILL
  • SIGPIPE
  • SIGQUIT
  • SIGSEGV
  • SIGTERM
  • SIGUSR1
  • SIGUSR2

You can catch all of these except SIGKILL, but hopefully SIGKILL won't come up very often for you.

Note that your signal man page (man 7 signal) should give you the proper list for your system - this is the POSIX list, and may differ depending on your architecture.

like image 102
Michael Kohne Avatar answered Nov 16 '22 03:11

Michael Kohne