[PATCH] Clarify English strsignal() messages.
Zack Weinberg
zack@owlfolio.org
Tue Sep 23 17:06:34 GMT 2025
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(-)
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"))
--
2.49.1
More information about the Libc-alpha
mailing list