Acknowledgement sent
to Michael Gold <[email protected]>:
New Bug report received and forwarded. Copy sent to Dr. Tobias Quathamer <[email protected]>.
(Sun, 08 Oct 2023 19:45:04 GMT) (full text, mbox, link).
Package: manpages-dev
Version: 6.03-2
Dear Maintainer,
I saw that the manual for exit(3) claimed "the least significant byte of
status (i.e., status & 0xFF) is returned to the parent". This surprised
me because I was pretty sure that POSIX required the full status to made
available. It does:
"the full value shall be available from waitid() and in the siginfo_t
passed to a signal handler for SIGCHLD."
https://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html
And the wait(2) manual page documents it as such:
"waitid()
…
si_status
Either the exit status of the child, as given to _exit(2) (or
exit(3)), or the signal that caused the child to terminate,
stop, or continue. The si_code field can be used to determine
how to interpret this field."
However, this doesn't actually work on Linux. Here's a test program:
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid=fork();
if(pid<0){perror("fork"); exit(1);}
if(pid==0)_exit(12345);
siginfo_t si={0};
pid=waitid(P_PID,pid,&si,WEXITED);
if(pid<0)perror("waitid");
printf("pid=%d, status=%d\n",pid,si.si_status);
}
It prints status=57 (12345 & 255), which is not "as given". Until Linux
is changed to follow the recent POSIX requirement, the manual should say
that si_status is the low 8 bits. It might also be helpful to note this
as a deviation from the 2018 edition of POSIX.
By the way, running the test with "strace -f" shows that the child gives
the full status code to the kernel, and the waitid() syscall returns the
truncated version.
- Michael
-- System Information:
Debian Release: trixie/sid
APT prefers unstable-debug
APT policy: (500, 'unstable-debug'), (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 6.5.0-1-amd64 (SMP w/32 CPU threads; PREEMPT)
Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8), LANGUAGE=en_CA:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages manpages-dev depends on:
ii manpages 6.03-2
manpages-dev recommends no packages.
Versions of packages manpages-dev suggests:
ii man-db [man-browser] 2.12.0-1
-- no debconf information