Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> traceroute в перл, выдача traceroute по timeout 
:(
    Опции темы
kukich
Дата 14.2.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Привет.Вот мой код:
Код

#!/usr/bin/perl
 $SIG{ALRM}=
 sub{ print $trace;};
 alarm 20;
 $trace=`traceroute 89.179.112.0`;
 alarm 0;

Задача следующая - есть адрес,надо посмотреть куда он уходит.Обычно в команде traceroute в конце идет ответ *** ,а это у меня не интересует.Хочу чтобы программа брала первые 20 секунд traceroute и выдавала мне их.А вместо этого она сначало выполняет 20 секунд traceroute ,а затем выполняет его еще раз для печати полностью,вместо того,чтобы напечатать что уже найдено.
Может есть какой то еще способ по таймауту выдавать traceroute?
PM MAIL   Вверх
Pfailed
Дата 15.2.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Вам нужен open с режимом открытия '-|', смотрите в perldoc. Затем в цикле читаете из файлового дескриптора и выводите. Прервать можно по сигналу таймера, либо по первой строке в которой встретились звездочки. Если по сигналу таймера, то стоит обернуть цикл чтения в eval {}


--------------------
PM MAIL   Вверх
kukich
Дата 15.2.2011, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



т.е. мне для начала надо писать в файл весь путь,а потом из него выводить часть до звездочки?а иначе я не понимаю зачем мне файл?

Это сообщение отредактировал(а) kukich - 15.2.2011, 16:16
PM MAIL   Вверх
Pfailed
Дата 15.2.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Никаких файлов. open с режимом '-|' связывает дескриптор со стандартным выводом команды, переданной третим параметром.
http://perldoc.perl.org/functions/open.html


--------------------
PM MAIL   Вверх
vivu
Дата 19.2.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Код

#!/usr/bin/perl

use strict;

my ($fh, $pid);
my @res = ();

eval {
    local $SIG{ALRM} = sub{ kill 9, $pid; close $fh; die "Time is out" };
    alarm 5;

    eval {
        $pid = open $fh, '-|', 'ping google.com' or die "Can't open file $!";
        while ( my $str =  <$fh> ) {
            push @res, $str;
        }
    };
    alarm 0;
};
alarm 0;
die $@ if $@ && $@ !~ /Time is out/;

print @res, $/;


Если обрабатывать сигнал ALARM, то как-то так будет выглядеть.
PM MAIL   Вверх
kukich
Дата 24.2.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Огромное спасибо,очень сильно помогли!

Добавлено через 1 минуту и 24 секунды
Цитата(vivu @ 19.2.2011,  19:34)
Код

#!/usr/bin/perl

use strict;

my ($fh, $pid);
my @res = ();

eval {
    local $SIG{ALRM} = sub{ kill 9, $pid; close $fh; die "Time is out" };
    alarm 5;

    eval {
        $pid = open $fh, '-|', 'ping google.com' or die "Can't open file $!";
        while ( my $str =  <$fh> ) {
            push @res, $str;
        }
    };
    alarm 0;
};
alarm 0;
die $@ if $@ && $@ !~ /Time is out/;

print @res, $/;


Если обрабатывать сигнал ALARM, то как-то так будет выглядеть.

Только вот не могу понять зачем дважды alarm 0 вызывать?
PM MAIL   Вверх
vivu
Дата 24.2.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Кусок с двойным eval'ом взял из Perl Cookbook глава 16.21. Там про это написано следующее:

Цитата

Почему мы используем вложенный перехват исключений? Потому что вы не можете быть уверены в том, что произвольный код вашей долгой операции не сгенерирует своё собственное исключение. Если это произойдёт, управление выйдет за пределы внутреннего блока евал с необработанным сигналом. Вторая команда alarm 0 необходима на тот случай, если сигнал поступил после выполнения длительной операции, но до первого вызова alarm 0. Если этого не сделать, возникает совсем ничтожный риск "ситуации перехвата" - но в этом случае размер значения не имеет; ситуация либо есть, либо её нет.


вот
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.