>>>>> Anatoly A Kazantsev <anat...@gnu.org> writes: […]
> @@ -348,9 +349,17 @@ main(int argc, char *argv[]) > break; > default: /* Parent. */ > - if (waitpid (pid, NULL, 0) == -1) > + if (waitpid (pid, &status, 0) == -1) > error (8, errno, "waitpid"); > + if (WIFSIGNALED (status)) > + error (WTERMSIG (status) + 128, 0, > + "%s for child", strsignal (WTERMSIG (status))); > + > + if (WIFEXITED (status)) > + error (WEXITSTATUS (status), 0, > + "Error %d for child", WEXITSTATUS (status)); > + > err = fsys_goaway (active_control, goaway_flags); > if (err && err != EBUSY) > error (9, err, "fsys_goaway"); > I have a question: why in case WIFSIGNALED the value of status is > increased by 128? When a program is terminated by a signal, its exit code is 128 plus the number of that signal; consider, e. g.: $ bash -c 'kill -8 -- $$' ; echo "Exit code: $?, Signal: $(($? - 128))" /bin/bash: line 1: 11876 Floating point exceptionbash -c 'kill -8 -- $$' Exit code: 136, Signal: 8 $ In this case, the utilities have to pass that exit code through, which is implemented as: 1. “decoding” the status into a “terminated due to a signal” flag and /either/ the “plain” exit code /or/ the signal number; 2. “encoding” these two values back into a single exit code, which is passed to exit () via error (). I don’t know where exactly this convention originated from, but I’m pretty sure that it was in every revision of POSIX ever published, and probably is almost as old as Unix itself. […] -- FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A