Merge remote-tracking branch 'origin/topic/jsiwek/raw-exec-pgrp'

* origin/topic/jsiwek/raw-exec-pgrp:
  Kill raw input reader's child by process group.

BIT-1081 #merged
This commit is contained in:
Robin Sommer 2013-09-20 14:12:13 -07:00
commit 97cb04aae2
4 changed files with 19 additions and 21891 deletions

21887
CHANGES

File diff suppressed because it is too large Load diff

View file

@ -65,6 +65,7 @@ test:
test-all: test
test -d aux/broctl && ( cd aux/broctl && make test )
test -d aux/btest && ( cd aux/btest && make test )
configured:
@test -d $(BUILD) || ( echo "Error: No build/ directory found. Did you run configure?" && exit 1 )

View file

@ -1 +1 @@
2.1-1368
2.1-1370

View file

@ -73,15 +73,15 @@ void Raw::DoClose()
if ( execute && childpid > 0 && kill(childpid, 0) == 0 )
{
// kill child process
kill(childpid, SIGTERM);
// Kill child process group.
kill(-childpid, SIGTERM);
if ( forcekill )
{
usleep(200); // 200 msecs should be enough for anyone ;)
if ( kill(childpid, 0) == 0 ) // perhaps it is already gone
kill(childpid, SIGKILL);
kill(-childpid, SIGKILL);
}
}
}
@ -146,6 +146,11 @@ bool Raw::Execute()
else if ( childpid == 0 )
{
// we are the child.
// Obtain a process group w/ child's PID.
if ( setpgid(0, 0) == -1 )
_exit(251);
close(pipes[stdout_in]);
if ( dup2(pipes[stdout_out], stdout_fileno) == -1 )
_exit(252);
@ -180,6 +185,15 @@ bool Raw::Execute()
else
{
// we are the parent
// Parent also sets child process group immediately to avoid a race.
if ( setpgid(childpid, childpid) == -1 )
{
char buf[256];
strerror_r(errno, buf, sizeof(buf));
Warning(Fmt("Could not set child process group: %s", buf));
}
if ( ! UnlockForkMutex() )
return false;