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

}

Re: fork в perl`е

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

tmp ()

Re: fork в perl`е

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

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

HTH

Onanim ()
Ответ на: Re: fork в perl`е от cvv

Re: fork в perl`е

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

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

Onanim ()
Ответ на: Re: fork в perl`е от Onanim

Re: fork в perl`е

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

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

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

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

cvv ★★★★★ ()
Ответ на: Re: fork в perl`е от Onanim

Re: fork в 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();

anonymous ()
Ответ на: Re: fork в perl`е от anonymous

Re: fork в perl`е

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

cvv ★★★★★ ()
Ответ на: Re: fork в perl`е от anonymous

Re: fork в perl`е

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

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

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

HTH


Onanim ()
Ответ на: Re: fork в perl`е от Onanim

Re: fork в perl`е

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

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