Вот примет кода на перле. Проблема в том, что когда мрет один из дочерних процессов, то отваливается и родительсий процесс, т.е. нет слежения за нарождением и умиранием процессов. Подскажите в чем проблемма. Обработчик сигалов и все остальное не показал, что бы не загромождать лишними деталями.
for ( ;;)
{
if ( $child_count < $max_child)
{
my $pid;
$pid = fork();
if ( $pid > 0)
{
++$child_count;
}
elsif ( $pid == 0)
{
my $client = $server -> accept();
my $res = '';
while
(
( $res ne "qqq") and
( defined ( $res))
)
{
$res = <$client>;
print ( $client "$res");
chop $res;
print ( "From client:--==$res==--\n");
}
close ( $server);
print ( STDERR "exit, pid $pid\n");
exit 0;
}
else
{
print ( STDERR "error - can`t create child");
}
}
else
{
sleep ( 1);
print ( STDERR "sleep, child_count $child_count \n");
}
}
Вот примет кода на перле. Проблема в том, что когда мрет один из дочерних процессов, то отваливается и родительсий процесс, т.е. нет слежения за нарождением и умиранием процессов. Подскажите в чем проблемма. Обработчик сигалов и все остальное не показал, что бы не загромождать лишними деталями.
Если ты хочешь хороший ответ запости минимальный (но рабочий!) код,
воспроизводящий твой проблему.
Пока что несколько мелких замечаний:
1. Ты почему-то не ждешь child-процессы при помощи wait()/waitpid().
2. Используй chomp а не chop.
3. Наверное в child-процессе надо закрывать $server сразу после accept().
4. Ты _точно_ используешь use warnings и use strict ???
5. На Perl конечно можно писать в стиле C но лучше делать это в стиле Perl ;-)
1) Жду, код ниже.
2) Так и делаю, просто это описка.
3) Точно, наерное надо, просто никогда не писал сетевые приложения не перле. В основном на сях.
4) Код ниже.
5) Что такое сить прела :).
#!/usr/bin/perl
use strict;
use server_lib;
use IO::Socket;
use POSIX;
my $host;
my $port;
my $child_count;
my $max_child;
my $server;
sub main
{
&init();
for ( ;;)
{
if ( $child_count < $max_child)
{
my $pid;
$pid = fork();
if ( $pid > 0)
{
++$child_count;
}
elsif ( $pid == 0)
{
my $client = $server -> accept();
my $res = '';
#my $res = <$client>;
while
(
( $res ne "qqq") and
( defined ( $res))
)
{
$res = <$client>;
print ( $client "$res");
chop $res;
print ( "From client: --==$res");
print ( "==--\n");
}
close ( $server);
exit 0;
}
else
{
print ( STDERR "error - can`t create child");
}
}
else
{
sleep ( 1);
}
}
};
sub sig_chld
{
exit 0;
while ( waitpid ( -1, WNOHANG) > 0 )
{
--$child_count;
}
};
sub init
{
#my $host = '127.0.0.1';
$host = '192.168.0.6';
$port = 3333;
$child_count = 0;
$max_child = 15;
$| = 1;
$SIG{'CHLD'} = \&sig_chld;
$server = new IO::Socket::INET
(
LocalPort => $port,
Type => SOCK_STREAM,
Listen => 10
) or die ( "can`t create socket!!!!");
};
&main();