diff mbox series

Clarify English strsignal() messages.

Message ID f0562038-1c85-4c9b-b9c3-aff24e597685@app.fastmail.com
State New
Headers show
Series Clarify English strsignal() messages. | expand

Commit Message

Zack Weinberg Sept. 23, 2025, 5:06 p.m. UTC
Several of the strsignal() messages for the English locale are
cryptic, inconsistent among a subgroup, or reflect what the signal
was *originally* used for, rather than what it is used for today.
Improve this somewhat.

95% of the practical value of this patch is in the change for the
SIGFPE message, but if we’re gonna edit these messages at all,
I think we should edit all of them at once.  I'm working on a follow-up
patch that tackles the strerror() messages and the manual's explanation
of each error code, but this requires quite a bit more research.

“Floating point exception” -> “Arithmetic exception”:
  Nowadays SIGFPE is almost always caused by *integer* divide by zero,
  since ISO C says the floating point environment at program startup
  has trapping disabled for all exceptions (C2011: Annex F subsection 8.3).
  When I was teaching CS I regularly got questions from students about
  why they got this error message when their program didn’t use any
  floating point at all.  “Arithmetic exception” is the phrase used by
  musl libc, and also by the entire Sun clade for many years.

“Hangup” -> “Terminal disconnected”
  Also motivated by questions from confused students.  “Hangup” is
  fossil jargon from the days when remote terminals usually connected
  to the host over actual telephone lines, and when the most common
  type of *telephone* had a thingy that you would actually hang up
  when you were done talking.  “Terminal disconnected” should be much
  clearer to people who don’t remember those days.

“Alarm clock” -> “Wall clock timer expired”
  Clearer description of what happened; improved consistency with
  SIGVTALRM and SIGPROF.

“Virtual timer expired” -> “CPU timer expired”
  The old message was unclear about what, exactly, was virtual.
  “CPU timer expired” uses the same terminology as SIGXCPU
  (“CPU time limit expired”).

“Quit” -> “Forced to quit”, “Interrupt” -> “Interrupted”
  Consistent use of past tense for signals indicating external
  cancellation of the program (compare “Terminated”, “Killed”,
  “CPU time limit exceeded”, etc.)  “Forced to quit” also better
  describes the effect of SIGQUIT, which is normally triggered by
  the user typing ^\.

“EMT trap” -> “CPU emulation trap”
  This signal _does_ still get generated sometimes (or I wouldn’t
  have bothered).  As far as I can tell from source diving the Linux
  kernel, it’s used when the kernel needs to emulate a machine
  instruction, and the emulation attempt fails for whatever reason;
  the new phrase tries to reflect that.

“Illegal instruction” -> “Invalid CPU instruction”
  I vaguely recall something in the GNU coding standards about
  preferring “invalid” to “illegal” unless something is actually
  against the law.  Indicate what kind of instructions are meant.

---
 po/libc.pot               | 233 +++++++++++++++++++++-----------------
 sysdeps/generic/siglist.h |  31 +++--
 2 files changed, 152 insertions(+), 112 deletions(-)

Comments

Florian Weimer Sept. 24, 2025, 8:08 a.m. UTC | #1
* Zack Weinberg:

> Several of the strsignal() messages for the English locale are
> cryptic, inconsistent among a subgroup, or reflect what the signal
> was *originally* used for, rather than what it is used for today.
> Improve this somewhat.
>
> 95% of the practical value of this patch is in the change for the
> SIGFPE message, but if we’re gonna edit these messages at all,
> I think we should edit all of them at once.  I'm working on a follow-up
> patch that tackles the strerror() messages and the manual's explanation
> of each error code, but this requires quite a bit more research.
>
> “Floating point exception” -> “Arithmetic exception”:
>   Nowadays SIGFPE is almost always caused by *integer* divide by zero,
>   since ISO C says the floating point environment at program startup
>   has trapping disabled for all exceptions (C2011: Annex F subsection 8.3).
>   When I was teaching CS I regularly got questions from students about
>   why they got this error message when their program didn’t use any
>   floating point at all.  “Arithmetic exception” is the phrase used by
>   musl libc, and also by the entire Sun clade for many years.

But is “exception” really the right term here?  Language-level
exceptions don't result in signals.

> “Illegal instruction” -> “Invalid CPU instruction”
>   I vaguely recall something in the GNU coding standards about
>   preferring “invalid” to “illegal” unless something is actually
>   against the law.  Indicate what kind of instructions are meant.

It's not necessarily an invalid instruction.  Several architectures have
an instruction that is defined to produce this signal.

Thanks,
Florian
Zack Weinberg Sept. 25, 2025, 3:40 p.m. UTC | #2
On Wed, Sep 24, 2025, at 4:08 AM, Florian Weimer wrote:
> * Zack Weinberg:
>> “Floating point exception” -> “Arithmetic exception”:
>>   Nowadays SIGFPE is almost always caused by *integer* divide by zero,
>>   since ISO C says the floating point environment at program startup
>>   has trapping disabled for all exceptions (C2011: Annex F subsection 8.3).
>>   When I was teaching CS I regularly got questions from students about
>>   why they got this error message when their program didn’t use any
>>   floating point at all.  “Arithmetic exception” is the phrase used by
>>   musl libc, and also by the entire Sun clade for many years.
>
> But is “exception” really the right term here?  Language-level
> exceptions don't result in signals.

I'm not attached to the word.  It's used by two other C libraries and
by IEEE 754 (and thus <fenv.h>), but I don't feel that's a strong
argument.  None of the other synchronous CPU-triggered signals use
"execption" ...

SIGBUS    -> "Bus error"
SIGSEGV   -> "Segmentation fault"
SIGSTKFLT -> "Stack fault"

SIGEMT    -> "CPU emulation trap"       (was "EMT trap")
SIGILL    -> "Invalid CPU instruction"  (was "Illegal instruction")
SIGTRAP   -> "Trace/breakpoint trap"

SIGFPE    -> "Arithmetic exception"     (was "Floating point exception")

... however, SIGFPE _is_ in a class of its own.  The others either
indicate a memory access error (SIGBUS, SIGSEGV, SIGSTKFLT),
a machine instruction that the CPU cannot execute (SIGEMT, SIGILL),
or a machine instruction whose sole function is to cause a hardware
trap (SIGTRAP).  SIGFPE indicates neither of those things; it means
the mathematical result of an arithmetic operation is either
undefined or unrepresentable.

We are _almost_ consistently using the word "fault" for memory access
errors, and "trap" for troublesome machine instructions.  I don't
think we should reuse either for SIGFPE.  "Invalid arithmetic operation"
would be clearer for integer divide by zero and also for _some_ IEEE 754
exceptions, but not for FE_{INEXACT,UNDERFLOW,OVERFLOW} conditions.
"Undefined or unrepresentable arithmetic result" would be exact but is
a bit too much of a mouthful.

I dunno.  Does anyone else have an opinion?

(I'm hesitant to change SIGBUS, but making it be "Bus fault" would
mean that we _consistently_ used "fault" for memory access errors.)

>> “Illegal instruction” -> “Invalid CPU instruction”
>>   I vaguely recall something in the GNU coding standards about
>>   preferring “invalid” to “illegal” unless something is actually
>>   against the law.  Indicate what kind of instructions are meant.
>
> It's not necessarily an invalid instruction.  Several architectures
> have an instruction that is defined to produce this signal.

I don't think that's a strong argument.  "The ISA defines an
instruction whose effect is to trigger the invalid-instruction trap"
is not meaningfully different from "the ISA defines an instruction-like
bit pattern that is permanently reserved and will never be a valid CPU
instruction".

zw
diff mbox series

Patch

diff --git a/po/libc.pot b/po/libc.pot
index 1ed1c521f9..0af07382bd 100644
--- a/po/libc.pot
+++ b/po/libc.pot
@@ -5,8 +5,8 @@ 
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: libc 2.41.9000\n"
-"POT-Creation-Date: 2025-07-19 22:21+0200\n"
+"Project-Id-Version: libc 2.42.9000\n"
+"POT-Creation-Date: 2025-09-18 13:08-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -148,7 +148,7 @@  msgid ""
 msgstr ""
 
 #: catgets/gencat.c:246 debug/pcprofiledump.c:235 debug/xtrace.sh:63
-#: elf/ldconfig.c:232 elf/ldd.bash.in:38 elf/pldd.c:262 elf/sotruss.sh:75
+#: elf/ldconfig.c:232 elf/ldd.bash.in:39 elf/pldd.c:262 elf/sotruss.sh:75
 #: elf/sprof.c:388 iconv/iconv_prog.c:391 iconv/iconvconfig.c:397
 #: locale/programs/locale.c:292 locale/programs/localedef.c:459
 #: login/programs/pt_chown.c:62 malloc/memusage.sh:70 malloc/memusagestat.c:582
@@ -331,7 +331,7 @@  msgid ""
 "\n"
 msgstr ""
 
-#: debug/xtrace.sh:56 elf/ldd.bash.in:55 elf/sotruss.sh:49
+#: debug/xtrace.sh:56 elf/ldd.bash.in:56 elf/sotruss.sh:49
 #: malloc/memusage.sh:63
 msgid "For bug reporting instructions, please see:\\\\n%s.\\\\n"
 msgstr ""
@@ -515,11 +515,11 @@  msgstr ""
 msgid "cannot stat shared object"
 msgstr ""
 
-#: elf/dl-load.c:1071 elf/dl-load.c:2155
+#: elf/dl-load.c:1071 elf/dl-load.c:2144
 msgid "cannot create shared object descriptor"
 msgstr ""
 
-#: elf/dl-load.c:1090 elf/dl-load.c:1605 elf/dl-load.c:1711
+#: elf/dl-load.c:1090 elf/dl-load.c:1594 elf/dl-load.c:1700
 msgid "cannot read file data"
 msgstr ""
 
@@ -527,95 +527,95 @@  msgstr ""
 msgid "ELF load command address/offset not page-aligned"
 msgstr ""
 
-#: elf/dl-load.c:1235
+#: elf/dl-load.c:1224
 msgid "object file has no loadable segments"
 msgstr ""
 
-#: elf/dl-load.c:1252
+#: elf/dl-load.c:1241
 msgid "cannot dynamically load executable"
 msgstr ""
 
-#: elf/dl-load.c:1259
+#: elf/dl-load.c:1248
 msgid "object file has no dynamic section"
 msgstr ""
 
-#: elf/dl-load.c:1294
+#: elf/dl-load.c:1283
 msgid "cannot dynamically load position-independent executable"
 msgstr ""
 
-#: elf/dl-load.c:1296
+#: elf/dl-load.c:1285
 msgid "shared object cannot be dlopen()ed"
 msgstr ""
 
-#: elf/dl-load.c:1309
+#: elf/dl-load.c:1298
 msgid "cannot allocate memory for program header"
 msgstr ""
 
-#: elf/dl-load.c:1334
+#: elf/dl-load.c:1323
 msgid "cannot enable executable stack as shared object requires"
 msgstr ""
 
-#: elf/dl-load.c:1362
+#: elf/dl-load.c:1351
 msgid "cannot close file descriptor"
 msgstr ""
 
-#: elf/dl-load.c:1605
+#: elf/dl-load.c:1594
 msgid "file too short"
 msgstr ""
 
-#: elf/dl-load.c:1639
+#: elf/dl-load.c:1628
 msgid "invalid ELF header"
 msgstr ""
 
-#: elf/dl-load.c:1654
+#: elf/dl-load.c:1643
 msgid "ELF file data encoding not big-endian"
 msgstr ""
 
-#: elf/dl-load.c:1656
+#: elf/dl-load.c:1645
 msgid "ELF file data encoding not little-endian"
 msgstr ""
 
-#: elf/dl-load.c:1660
+#: elf/dl-load.c:1649
 msgid "ELF file version ident does not match current one"
 msgstr ""
 
-#: elf/dl-load.c:1664
+#: elf/dl-load.c:1653
 msgid "ELF file OS ABI invalid"
 msgstr ""
 
-#: elf/dl-load.c:1667
+#: elf/dl-load.c:1656
 msgid "ELF file ABI version invalid"
 msgstr ""
 
-#: elf/dl-load.c:1670
+#: elf/dl-load.c:1659
 msgid "nonzero padding in e_ident"
 msgstr ""
 
-#: elf/dl-load.c:1673
+#: elf/dl-load.c:1662
 msgid "internal error"
 msgstr ""
 
-#: elf/dl-load.c:1680
+#: elf/dl-load.c:1669
 msgid "ELF file version does not match current one"
 msgstr ""
 
-#: elf/dl-load.c:1692
+#: elf/dl-load.c:1681
 msgid "only ET_DYN and ET_EXEC can be loaded"
 msgstr ""
 
-#: elf/dl-load.c:1697
+#: elf/dl-load.c:1686
 msgid "ELF file's phentsize not the expected size"
 msgstr ""
 
-#: elf/dl-load.c:2174
+#: elf/dl-load.c:2163
 msgid "wrong ELF class: ELFCLASS64"
 msgstr ""
 
-#: elf/dl-load.c:2175
+#: elf/dl-load.c:2164
 msgid "wrong ELF class: ELFCLASS32"
 msgstr ""
 
-#: elf/dl-load.c:2178
+#: elf/dl-load.c:2167
 msgid "cannot open shared object file"
 msgstr ""
 
@@ -916,11 +916,11 @@  msgstr ""
 msgid "Can't open cache file directory %s\n"
 msgstr ""
 
-#: elf/ldd.bash.in:42
+#: elf/ldd.bash.in:43
 msgid "Written by %s and %s.\n"
 msgstr ""
 
-#: elf/ldd.bash.in:47
+#: elf/ldd.bash.in:48
 msgid ""
 "Usage: ldd [OPTION]... FILE...\n"
 "      --help              print this help and exit\n"
@@ -931,46 +931,46 @@  msgid ""
 "  -v, --verbose           print all information\n"
 msgstr ""
 
-#: elf/ldd.bash.in:80
+#: elf/ldd.bash.in:81
 msgid "ldd: option \\`$1' is ambiguous"
 msgstr ""
 
-#: elf/ldd.bash.in:87
+#: elf/ldd.bash.in:88
 msgid "unrecognized option"
 msgstr ""
 
-#: elf/ldd.bash.in:88 elf/ldd.bash.in:125
+#: elf/ldd.bash.in:89 elf/ldd.bash.in:126
 msgid "Try \\`ldd --help' for more information."
 msgstr ""
 
-#: elf/ldd.bash.in:124
+#: elf/ldd.bash.in:125
 msgid "missing file arguments"
 msgstr ""
 
 #. TRANS This is a ``file doesn't exist'' error
 #. TRANS for ordinary files that are referenced in contexts where they are
 #. TRANS expected to already exist.
-#: elf/ldd.bash.in:147 sysdeps/gnu/errlist.h:13
+#: elf/ldd.bash.in:148 sysdeps/gnu/errlist.h:13
 msgid "No such file or directory"
 msgstr ""
 
-#: elf/ldd.bash.in:150 inet/rcmd.c:483
+#: elf/ldd.bash.in:151 inet/rcmd.c:483
 msgid "not regular file"
 msgstr ""
 
-#: elf/ldd.bash.in:153
+#: elf/ldd.bash.in:154
 msgid "warning: you do not have execution permission for"
 msgstr ""
 
-#: elf/ldd.bash.in:170
+#: elf/ldd.bash.in:171
 msgid "\tnot a dynamic executable"
 msgstr ""
 
-#: elf/ldd.bash.in:178
+#: elf/ldd.bash.in:179
 msgid "exited with unknown exit code"
 msgstr ""
 
-#: elf/ldd.bash.in:183
+#: elf/ldd.bash.in:184
 msgid "error: you do not have read permission for"
 msgstr ""
 
@@ -5333,47 +5333,54 @@  msgstr ""
 msgid "error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:29
-msgid "Hangup"
-msgstr ""
-
+#. TRANS Formerly "Hangup".
 #: sysdeps/generic/siglist.h:30
-msgid "Interrupt"
+msgid "Terminal disconnected"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:31
-msgid "Quit"
+msgid "Interrupted"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:32
-msgid "Illegal instruction"
+msgid "Forced to quit"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:33
-msgid "Trace/breakpoint trap"
+msgid "Invalid CPU instruction"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:34
-msgid "Aborted"
+msgid "Trace/breakpoint trap"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:35
-msgid "Floating point exception"
+msgid "Aborted"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:36
+#. TRANS Formerly "Floating point exception".
+#. TRANS The program tried to carry out an invalid arithmetic operation.
+#. TRANS Nowadays the most common reason for this signal is @emph{integer}
+#. TRANS division by zero.  Floating point operations @emph{can} still
+#. TRANS cause signals, but nowadays they usually produce a special
+#. TRANS "infinity" or "not a number" value instead.
+#: sysdeps/generic/siglist.h:43
+msgid "Arithmetic exception"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:44
 msgid "Killed"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:37
+#: sysdeps/generic/siglist.h:45
 msgid "Bus error"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:38
+#: sysdeps/generic/siglist.h:46
 msgid "Bad system call"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:39
+#: sysdeps/generic/siglist.h:47
 msgid "Segmentation fault"
 msgstr ""
 
@@ -5382,95 +5389,101 @@  msgstr ""
 #. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
 #. TRANS or blocked.  Thus, your program will never actually see @code{EPIPE}
 #. TRANS unless it has handled or blocked @code{SIGPIPE}.
-#: sysdeps/generic/siglist.h:40 sysdeps/gnu/errlist.h:216
+#: sysdeps/generic/siglist.h:48 sysdeps/gnu/errlist.h:216
 msgid "Broken pipe"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:41
-msgid "Alarm clock"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:42
-msgid "Terminated"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:43
-msgid "Urgent I/O condition"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:44
-msgid "Stopped (signal)"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:45
-msgid "Stopped"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:46
-msgid "Continued"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:47
-msgid "Child exited"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:48
-msgid "Stopped (tty input)"
-msgstr ""
-
-#: sysdeps/generic/siglist.h:49
-msgid "Stopped (tty output)"
-msgstr ""
-
+#. TRANS Formerly "Alarm clock".
 #: sysdeps/generic/siglist.h:50
-msgid "I/O possible"
+msgid "Wall-clock timer expired"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:51
-msgid "CPU time limit exceeded"
+msgid "Terminated"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:52
-msgid "File size limit exceeded"
+msgid "Urgent I/O condition"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:53
-msgid "Virtual timer expired"
+msgid "Stopped (signal)"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:54
-msgid "Profiling timer expired"
+msgid "Stopped"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:55
-msgid "User defined signal 1"
+msgid "Continued"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:56
-msgid "User defined signal 2"
+msgid "Child exited"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:57
-msgid "Window changed"
+msgid "Stopped (tty input)"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:58
+msgid "Stopped (tty output)"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:59
+msgid "I/O possible"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:60
+msgid "CPU time limit exceeded"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:61
-msgid "EMT trap"
+msgid "File size limit exceeded"
+msgstr ""
+
+#. TRANS Formerly "Virtual timer expired".
+#: sysdeps/generic/siglist.h:63
+msgid "CPU timer expired"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:64
-msgid "Stack fault"
+msgid "Profiling timer expired"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:65
+msgid "User defined signal 1"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:66
+msgid "User defined signal 2"
 msgstr ""
 
 #: sysdeps/generic/siglist.h:67
+msgid "Window changed"
+msgstr ""
+
+#. TRANS Formerly "EMT trap".  The program tried to execute a machine
+#. TRANS instruction that the CPU does not support, and the kernel either
+#. TRANS does not know how to, or has failed to, emulate it.  Rarely used
+#. TRANS on current CPU architectures.
+#: sysdeps/generic/siglist.h:76
+msgid "CPU emulation trap"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:79
+msgid "Stack fault"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:82
 msgid "Power failure"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:70
+#: sysdeps/generic/siglist.h:85
 msgid "Information request"
 msgstr ""
 
-#: sysdeps/generic/siglist.h:73
+#: sysdeps/generic/siglist.h:88
 msgid "Resource lost"
 msgstr ""
 
@@ -6316,6 +6329,18 @@  msgstr ""
 msgid "RPC program not available"
 msgstr ""
 
+#: sysdeps/gnu/errlist.h:801
+msgid "Initialization error"
+msgstr ""
+
+#: sysdeps/gnu/errlist.h:804
+msgid "Device is remote"
+msgstr ""
+
+#: sysdeps/gnu/errlist.h:807
+msgid "Too many levels of remote in path"
+msgstr ""
+
 #: sysdeps/hppa/dl-fptr.c:96
 msgid "cannot map pages for fdesc table"
 msgstr ""
diff --git a/sysdeps/generic/siglist.h b/sysdeps/generic/siglist.h
index 298da5ae0a..710a50b2d6 100644
--- a/sysdeps/generic/siglist.h
+++ b/sysdeps/generic/siglist.h
@@ -26,19 +26,28 @@ 
 
 /* Standard signals, in the numerical order defined in
    bits/signum-generic.h.  */
-  init_sig (SIGHUP, "HUP", N_("Hangup"))
-  init_sig (SIGINT, "INT", N_("Interrupt"))
-  init_sig (SIGQUIT, "QUIT", N_("Quit"))
-  init_sig (SIGILL, "ILL", N_("Illegal instruction"))
+/* TRANS Formerly "Hangup". */
+  init_sig (SIGHUP, "HUP", N_("Terminal disconnected"))
+  init_sig (SIGINT, "INT", N_("Interrupted"))
+  init_sig (SIGQUIT, "QUIT", N_("Forced to quit"))
+  init_sig (SIGILL, "ILL", N_("Invalid CPU instruction"))
   init_sig (SIGTRAP, "TRAP", N_("Trace/breakpoint trap"))
   init_sig (SIGABRT, "ABRT", N_("Aborted"))
-  init_sig (SIGFPE, "FPE", N_("Floating point exception"))
+/*
+TRANS Formerly "Floating point exception".
+TRANS The program tried to carry out an invalid arithmetic operation.
+TRANS Nowadays the most common reason for this signal is @emph{integer}
+TRANS division by zero.  Floating point operations @emph{can} still
+TRANS cause signals, but nowadays they usually produce a special
+TRANS "infinity" or "not a number" value instead.  */
+  init_sig (SIGFPE, "FPE", N_("Arithmetic exception"))
   init_sig (SIGKILL, "KILL", N_("Killed"))
   init_sig (SIGBUS, "BUS", N_("Bus error"))
   init_sig (SIGSYS, "SYS", N_("Bad system call"))
   init_sig (SIGSEGV, "SEGV", N_("Segmentation fault"))
   init_sig (SIGPIPE, "PIPE", N_("Broken pipe"))
-  init_sig (SIGALRM, "ALRM", N_("Alarm clock"))
+/* TRANS Formerly "Alarm clock".  */
+  init_sig (SIGALRM, "ALRM", N_("Wall-clock timer expired"))
   init_sig (SIGTERM, "TERM", N_("Terminated"))
   init_sig (SIGURG, "URG", N_("Urgent I/O condition"))
   init_sig (SIGSTOP, "STOP", N_("Stopped (signal)"))
@@ -50,7 +59,8 @@ 
   init_sig (SIGPOLL, "POLL", N_("I/O possible"))
   init_sig (SIGXCPU, "XCPU", N_("CPU time limit exceeded"))
   init_sig (SIGXFSZ, "XFSZ", N_("File size limit exceeded"))
-  init_sig (SIGVTALRM, "VTALRM", N_("Virtual timer expired"))
+/* TRANS Formerly "Virtual timer expired".  */
+  init_sig (SIGVTALRM, "VTALRM", N_("CPU timer expired"))
   init_sig (SIGPROF, "PROF", N_("Profiling timer expired"))
   init_sig (SIGUSR1, "USR1", N_("User defined signal 1"))
   init_sig (SIGUSR2, "USR2", N_("User defined signal 2"))
@@ -58,7 +68,12 @@ 
 
 /* Signals that are not present on all supported platforms.  */
 #ifdef SIGEMT
-  init_sig (SIGEMT, "EMT", N_("EMT trap"))
+/*
+TRANS Formerly "EMT trap".  The program tried to execute a machine
+TRANS instruction that the CPU does not support, and the kernel either
+TRANS does not know how to, or has failed to, emulate it.  Rarely used
+TRANS on current CPU architectures.  */
+  init_sig (SIGEMT, "EMT", N_("CPU emulation trap"))
 #endif
 #ifdef SIGSTKFLT
   init_sig (SIGSTKFLT, "STKFLT", N_("Stack fault"))