LINUX.ORG.RU

Как запретить parent процессам передавать сокеты child процессам?

 , , , ,


0

1

Вот пример кода:

#!/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 процесс не наследовал сокеты от предка.

★★★

Ответ на: комментарий от gh0stwizard

Закрыть этот сокет в child? А как получить этот сокет в потомке, который был создан в родителе?

Mrak ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.