correctly catch EINTR

This commit is contained in:
Dietmar Maurer 2011-10-18 07:26:43 +02:00
parent d33d0735a9
commit 8d6e045f21

View File

@ -2,7 +2,7 @@ package PVE::RPCEnvironment;
use strict; use strict;
use warnings; use warnings;
use POSIX ":sys_wait_h"; use POSIX qw(:sys_wait_h EINTR);
use IO::File; use IO::File;
use Fcntl qw(:flock); use Fcntl qw(:flock);
use PVE::SafeSyslog; use PVE::SafeSyslog;
@ -649,13 +649,25 @@ sub fork_worker {
if ($sync) { if ($sync) {
my $count; my $count;
my $outbuf = ''; my $outbuf = '';
my $int_count = 0;
eval { eval {
local $SIG{INT} = local $SIG{INT} = local $SIG{QUIT} = local $SIG{TERM} = sub {
local $SIG{QUIT} = if ($int_count < 3) {
local $SIG{TERM} = sub { die "got interrupt\n"; }; kill(15, $cpid); # send TERM signal
} else {
kill(9, $cpid); # send KILL signal
}
$int_count++;
};
local $SIG{PIPE} = sub { die "broken pipe\n"; }; local $SIG{PIPE} = sub { die "broken pipe\n"; };
while (($count = POSIX::read($psync[0], $readbuf, 4096)) && ($count > 0)) { while (1) {
if (!defined($count = POSIX::read($psync[0], $readbuf, 4096))) {
next if $! == EINTR;
last;
}
last if $count == 0; # eof
$outbuf .= $readbuf; $outbuf .= $readbuf;
while ($outbuf =~ s/^(([^\010\r\n]*)(\r|\n|(\010)+|\r\n))//s) { while ($outbuf =~ s/^(([^\010\r\n]*)(\r|\n|(\010)+|\r\n))//s) {
my $line = $1; my $line = $1;