git: 06c74693c286 - main - timeout(1): Also send SIGCONT because the child may be stopped
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 16 Apr 2025 19:46:32 UTC
The branch main has been updated by bapt:
URL: https://cgit.FreeBSD.org/src/commit/?id=06c74693c286185f299410afcd312fc54a96a052
commit 06c74693c286185f299410afcd312fc54a96a052
Author: Aaron LI <aly@aaronly.me>
AuthorDate: 2025-04-02 16:01:17 +0000
Commit: Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2025-04-16 19:45:38 +0000
timeout(1): Also send SIGCONT because the child may be stopped
The POSIX.1-2024 says:
"If the subsequent wait status of the child process shows that it was
stopped by a signal, a SIGCONT signal shall also be sent in the same
manner as the first signal; otherwise, a SIGCONT signal may be sent in
the same manner."
As it's allowed by the standard, we just always send the SIGCONT signal
to the child process regardless of its stop state, so that timeout could
terminate a stopped child.
Obtained-from: DragonFly BSD
Reference: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/timeout.html
---
bin/timeout/timeout.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/bin/timeout/timeout.c b/bin/timeout/timeout.c
index 8f933f509407..e702803a25c2 100644
--- a/bin/timeout/timeout.c
+++ b/bin/timeout/timeout.c
@@ -179,6 +179,24 @@ send_sig(pid_t pid, int signo, bool foreground)
(int)rk.rk_fpid);
logv("signaled %u processes", rk.rk_killed);
}
+
+ /*
+ * If the child process was stopped by a signal, POSIX.1-2024
+ * requires to send a SIGCONT signal. However, the standard also
+ * allows to send a SIGCONT regardless of the stop state, as we
+ * are doing here.
+ */
+ if (signo != SIGKILL && signo != SIGSTOP && signo != SIGCONT) {
+ logv("sending signal %s(%d) to command '%s'",
+ sys_signame[SIGCONT], SIGCONT, command);
+ if (foreground) {
+ kill(pid, SIGCONT);
+ } else {
+ memset(&rk, 0, sizeof(rk));
+ rk.rk_sig = SIGCONT;
+ procctl(P_PID, getpid(), PROC_REAP_KILL, &rk);
+ }
+ }
}
static void