Re: [ILUG] Signal handling thing

From: Brian Foster (blf at domain utvinternet.ie)
Date: Wed 26 Jun 2002 - 12:45:59 IST


  | Date: Wed, 26 Jun 2002 11:57:07 +0200
  | From: David Neary <dneary at domain wanadoo.fr>
  |
  | Hi all,
  |
  | This is kind of puzzling me - I'm sure I've done stuff similar
  | to this a million tomes, but I'm having trouble getting this
  | working. Can anyone see what I'm doing wrong here?
  |
  | Basically I'm expecting signal 42 (MYSIG) to be raised an
  | indefinite number of times, until I raise SIGINT in the usual
  | manner. But I'm getting a system "Real-time signal 10" message,
  | and the program exits, after the first call (presumably, when my
  | sign-handler's called a second time). Any idea why? Something
  | idiotic I'm missing?

 easy. the implementation of signal(2) you are using is probably
 following the original Unix semantics of reseting the handler to
 SIG_DFN when the signal is delivered. so what's happening is the
 1st MY_SIG is raise(3)ed and delivered Ok, but that delivery resets
 MY_SIGs handler to SIG_DFN. hence, there is no handler to catch
 the 2nd `raise', and hence the program exits (which is the default
 action on most signals, including, I presume, MY_SIG).

 the ``Real-time ...'' message is being printed by your shell in
 response to the imputed _exit(2) status; indeed, note that on many
 systems, SIGRTMIN+10 == 42, which is MY_SIG ....

 best fix (IMHO) is to use sigaction(2), not signal(2). b.t.w.,
 this example is precisely why I recommend _never_ using `signal'
 (provided `sigaction' is available).

 also, AFAIK, printf(3) and friends are not considered signal safe
 (i.e., are "unsafe" in ANSI C89), and hence, in theory, should
 never be used in a signal hander.

 and, pedantic point time, POSIX.4 (or .1c or whatever it is now)
 says SIGRTMIN needn't be a compile-time constant. hence, it is
 pedantically incorrect to simply define MY_SIG as a constant;
 it should _always_ be defined in terms of SIGRTMIN.

cheers!
        -blf-

--
 Innovative, very experienced, Unix and      | Brian Foster    Dublin, Ireland
 Chorus (embedded RTOS) kernel internals     | e-mail: blf at domain utvinternet.ie
 expert looking for a new position ...       | mobile: (+353 or 0)86 854 9268
  For a résumé, contact me, or see my website  http://www.blf.utvinternet.ie
    Stop E$$o (ExxonMobile):  «Whatever you do, don't buy Esso --- they
     don't give a damn about global warming.»    http://www.stopesso.com
     Supported by Greenpeace, Friends of the Earth, and numerous others...


This archive was generated by hypermail 2.1.6 : Thu 06 Feb 2003 - 13:17:33 GMT