timeout: with --foreground don't send SIGCONT

* src/timeout.c (cleanup): Don't send SIGCONT to the monitored program
when --foreground is specified, as it's generally not needed for
foreground programs, and can cause intermittent signal delivery
issues with monitors like GDB for example.
* doc/coreutils.texi (timeout invocation): Mention that SIGCONT
is not sent with --foreground.
* NEWS: Mention the behavior change.
This commit is contained in:
Pádraig Brady 2015-05-13 13:41:42 +01:00
parent 703747f892
commit 45b8fe430d
3 changed files with 13 additions and 6 deletions

2
NEWS
View File

@ -92,6 +92,8 @@ GNU coreutils NEWS -*- outline -*-
tee does not treat the file operand '-' as meaning standard output any longer,
for better conformance to POSIX. This feature was added in coreutils-5.3.0.
timeout --foreground no longer sends SIGCONT to the monitored process,
which was seen to cause intermittent issues with GDB for example.
** Improvements

View File

@ -16594,7 +16594,10 @@ from the terminal (like Ctrl-C for example)
@end enumerate
Note in this mode of operation, any children of @var{command}
will not be timed out.
will not be timed out. Also SIGCONT will not be sent to @var{command},
as it's generally not needed with foreground processes, and can
cause intermittent signal delivery issues with programs that are monitors
themselves (like GDB for example).
@item -k @var{duration}
@itemx --kill-after=@var{duration}

View File

@ -203,15 +203,17 @@ cleanup (int sig)
in case it has itself become group leader,
or is not running in a separate group. */
send_sig (monitored_pid, sig);
/* The normal case is the job has remained in our
newly created process group, so send to all processes in that. */
if (!foreground)
send_sig (0, sig);
if (sig != SIGKILL && sig != SIGCONT)
{
send_sig (monitored_pid, SIGCONT);
if (!foreground)
send_sig (0, SIGCONT);
send_sig (0, sig);
if (sig != SIGKILL && sig != SIGCONT)
{
send_sig (monitored_pid, SIGCONT);
send_sig (0, SIGCONT);
}
}
}
else /* we're the child or the child is not exec'd yet. */