Вот пример кода:
#!/usr/bin/perl
use strict;
use FCGI;
my $port = $ARGV[0] || 9000;
if($port == 9000){
print "First started\n";
}
else{
print "Second started\n";
}
my $socket = FCGI::OpenSocket(":$port", 5);
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
if($port == 9000){
system('ls -l /proc/self/fd');
system('./test 9002 &');
print "First ended\n";
}
else{
sleep 2;
system('ls -l /proc/self/fd');
print "Second ended\n";
}
Результат программы:
www-data@laptop:~$ ./test
First started
итого 0
lrwx------ 1 www-data www-data 64 Май 21 21:22 0 -> /dev/pts/3
lrwx------ 1 www-data www-data 64 Май 21 21:22 1 -> /dev/pts/3
lrwx------ 1 www-data www-data 64 Май 21 21:22 2 -> /dev/pts/3
lrwx------ 1 www-data www-data 64 Май 21 21:22 3 -> socket:[261673]
lr-x------ 1 www-data www-data 64 Май 21 21:22 4 -> /proc/8177/fd
First ended
Second started
итого 0
lr-x------ 1 www-data www-data 64 Май 21 21:22 0 -> /dev/null
lrwx------ 1 www-data www-data 64 Май 21 21:22 1 -> /dev/pts/3
lrwx------ 1 www-data www-data 64 Май 21 21:22 2 -> /dev/pts/3
lrwx------ 1 www-data www-data 64 Май 21 21:22 3 -> socket:[261673]
lrwx------ 1 www-data www-data 64 Май 21 21:22 4 -> socket:[261689]
lr-x------ 1 www-data www-data 64 Май 21 21:22 5 -> /proc/8180/fd
Second ended
Как видно из кода и результата - child процесс наследовал socket от родителя, даже если родитель уже завершился, а сокет не освобождается.
Как избежать этой ситуации? Хочу что-бы child процесс не наследовал сокеты от предка.