Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Proposal: new libc/libutil functions to map SIGXXXX <-> "XXXX"



    Date:        Wed, 3 May 2017 13:17:29 +0200
    From:        Joerg Sonnenberger <joerg%bec.de@localhost>
    Message-ID:  <20170503111729.GB6044%britannica.bec.de@localhost>

  | It might be useful to mention in the man page that the signal names are
  | locale independent.

I enclose a new man page below (and as before
	ftp://munnari.oz.au/kre/signame.tgz
has been updated).

I am not sure I like the wording, but English (or any other natural language)
is not what I am supposed to be competent at...   So, all suggestions
appreciated.

I am also going to defer implementing this for a few more days, as I have
added to the interface spec (one additional function).

As specified by POSIX, all we know is that there are (26 I think it is)
signals defined to exist (and more can be added, which we have done). plus
at least RTSIG_MAX real time signals, with values between SIGRTMIN and SIGRTMAX.

That's it, aside from not being 0, and (I think) all being different, there
is no specification at all of what values they have.   I don't even see
anything that prevents them being negative.

What's more, as I understand it, <signal.h> cannot export NSIG without
some other feature test macro (like _NETBSD_SOURCE) being defined to allow
it - so portable applications cannot use NSIG.   That really isn't a problem,
as just knowing that there are 63 signals (or whatever) doesn't help at all
when you have no idea what values they are.

[Aside: it is possible to implement sigset_t regardless of the values that
are assigned to SIGINT, SIGHUP, etc - it may not be quite as efficient as
when the signals are consecutive small integers, but it is possible.]

This isn't a problem for a program that just wants
	signal(SIGINT, SIG_IGN);
or similar - for that we don't care what the value of SIGINT is.

But for programs with a need to enumerate signals, catch all that are
catchable, or similar, there is no way defined currently to achieve that.

So, I added a function that can be used to enumerate the signals that
exist in the implementation, for those applications that need it.

As long as (in addition to 0) signal numbers cannot be -1 (allowing that
would be a real mess) the API actually works for any values at all,
including negative ones, even though at first glance it seems not to.
(The man page wording, however, is not so great!)

The current implementation however assumes NetBSD, and its SIGXXX values.

The implementations of these things (included in the tgz file above) are
very NetBSD (or at least, *BSD) specific, and rely upon existing libc
functionality, but they can be changed any time, if we come up with a
better way, without breaking programs that use this API.

Once again, comments & suggestions appreciated.

kre

SIGNALNAME(3)		   Library Functions Manual		 SIGNALNAME(3)

NAME
     signalname signalnumber signalnext -- convert between signal numbers and
     names

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <signal.h>

     const char *
     signalname(int sig);

     int
     signalnumber(const char *name);

     int
     signalnext(int sig);

DESCRIPTION
     The signalname() function takes a signal number sig, and returns the name
     of that signal.  The name returned is locale independent, and can be the
     string representation of one of the signal names from <signal.h> such as
     SIGHUP, SIGSTOP, SIGKILL, or some similar name, but does not contain the
     leading ``SIG'' prefix.

     The return value of signalname() is NULL if sig does not represent a
     valid signal number.

     The signalnumber() function converts the signal name name to the number
     corresponding to that signal.  The name is handled in a case-insensitive
     manner.  Any leading ``SIG'' prefix in name is ignored.

     The signalnumber() function returns the signal number, or zero (0) if the
     name given does not represent a valid signal.

     The signalnext() function takes a signal number, and returns the number
     of the next available bigger signal number.  When no higher signal
     numbers remain, it returns zero (0).  The parameter sig can be given as
     zero (0), to obtain the smallest implemented signal number.

     The signalnext() function returns minus one (-1) on error, if the given
     signal sig is neither a valid signal number, nor zero.  It returns zero
     when the input signal number, sig, is the biggest available signal
     number.  Otherwise it returns the signal number of an implemented signal
     that is larger than sig and such that there are no implemented signals
     with values between sig and the value returned.

SEE ALSO
     kill(1), intro(2), psignal(3), strsignal(3)

HISTORY
     The signalname(), signalnumber() and signalnext() functions first
     appeared in NetBSD 8.0.




Home | Main Index | Thread Index | Old Index