LINUX.ORG.RU

fork в perl`е


0

0

Вот примет кода на  перле. Проблема в том, что когда мрет один из дочерних процессов, то отваливается и родительсий процесс, т.е. нет слежения за нарождением и умиранием процессов. Подскажите в чем проблемма. Обработчик сигалов и все остальное не показал, что бы не загромождать лишними деталями.

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");
	}

}

Вот примет кода на перле. Проблема в том, что когда мрет один из дочерних процессов, то отваливается и родительсий процесс, т.е. нет слежения за нарождением и умиранием процессов. Подскажите в чем проблемма. Обработчик сигалов и все остальное не показал, что бы не загромождать лишними деталями.

tmp
() автор топика

Если ты хочешь хороший ответ запости минимальный (но рабочий!) код,
воспроизводящий твой проблему.

Пока что несколько мелких замечаний:
1. Ты почему-то не ждешь child-процессы при помощи wait()/waitpid().
2. Используй chomp а не chop.
3. Наверное в child-процессе надо закрывать $server сразу после accept().
4. Ты _точно_ используешь use warnings и use strict ???
5. На Perl конечно можно писать в стиле C но лучше делать это в стиле Perl ;-)

HTH

Onanim
()
Ответ на: комментарий от cvv

> может парента SIGCHLD убивает?

Угу. А еще может солнечная активность повышенная :-)))
Прошу привести пример системы, где SIGCHLD убивает
родительский процесс.

Onanim
()
Ответ на: комментарий от Onanim

по дефолту нигде.

тем не менее не так много способов при умирании child-a подействовать на parent-a. это ж не треды где один тред способен завалить весь процесс.

хто знает какие сигналы он поперехвачивал и какие обработчики понаустанавливал.

особенно если код до сих пор не показал.

cvv ★★★★★
()
Ответ на: комментарий от Onanim

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();

anonymous
()
Ответ на: комментарий от anonymous

что-то у тебя странная логика прослушки сокета, хотя работать как будто должна.

cvv ★★★★★
()
Ответ на: комментарий от anonymous

Ты что, издеваешься? :-(((
У тебя же в sig_chld первая строка - "exit 0".
Чего ты ожидаешь после такого ?

Еще пару комментариев:

1. Где use warnings ???
2. Для вызова функций в Perl уже давным-давно не надо писать
&init(). Можно просто init().

HTH


Onanim
()
Ответ на: комментарий от Onanim

!!!!!!!!!!!!!! Спасибо, я совсем запарился, огромное спасибо. За замечания спасибо.

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