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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывание потока по таймеру при зависании на recv 
:(
    Опции темы
alw39
Дата 3.7.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день ! В Perl новичек и сразу наткнулся на такую проблему.
Принимаем данные через сокет в отдельном потоке, при перезагрузке модема создается новый поток и данные идут уже в него, но старый поток остается висеть на recv хотя он должен завершится по прерыванию таймера, в варианте eval {} or die "recv from $tid timed out after $TIMEOUT seconds.\n";
иногда они проскакивают но абсолютно хаотично и только для 1-2х потоков.В чем может быть причина?
Система WinXP,perl 5.10.0 Strawberry.
Код

use strict;
use IO::Handle;
use  IO::Socket;
use threads;
use DBI;
use POSIX;
my $TIMEOUT=20;

my ($bytes_out,$bytes_in)=(0,0);
my $port='80';
my $sock=IO::Socket::INET->new(Listen=>20, LocalPort=>$port, Proto=>'tcp', Reuse=>1)
 or die "Can't create listening scocket: $!\n";
print "waiting for incoming connection on port $port...\n";
my $connection='';
while( $connection=$sock->accept){
my $peer=gethostbyaddr($connection->peeraddr,AF_INET) ||
$connection->peerhost;
my $port= $connection->peerport;
my $adr=$connection->peeraddr;
print "connection from [",inet_ntoa($adr),",$peer,$port]\n";
threads->new(\&interact ,$connection);
}
sub   interact{
my $hendl=shift;
my $tid=threads->tid();
threads->self->detach;
while(1)
{
print "$tid\n";
my  $date='';
my  $name='';
 eval {
   local $SIG{ALRM} = sub { die "alarm\n" };
    alarm $TIMEOUT;
      my $rv=$hendl->recv($date, 1024) or die "recv: $!";
   alarm 0;
    #   1;  # return value from eval on normalcy
};
 #or die "recv from $tid timed out after $TIMEOUT seconds.\n";
  die if $@ && $@ ne "alarm\n";  
if ($@) { print "last_ $tid\n";  last;}

}
print "$tid\n";
print "close\n" ;
$hendl->close();
}

PM MAIL   Вверх
shamber
Дата 3.7.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



WinXP, c alarm не особенно дружит.

Добавлено через 36 секунд
лучше отдельный процесс и управлять им.
PM MAIL Jabber   Вверх
alw39
Дата 3.7.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я так понял что проблема в системе т.е. надо переходить на Unix и использовать fork ? 
PM MAIL   Вверх
KSURi
Дата 3.7.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я бы даже сказал совсем не дружит. Если я правильно помню, то на win-платформе вообще нету SIGALRM.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
amg
Дата 3.7.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(KSURi @  3.7.2009,  14:18 Найти цитируемый пост)
на win-платформе вообще нету SIGALRM
Вроде, там любой сигнал воспринимается как INT (2).

PM MAIL   Вверх
alw39
Дата 3.7.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переустановил perl c ActiveState, программка заработала но как то странно , при отключении питания модема поток зависает и висит на recv неопределенное время , после включения cрабатывает перывание поток закрывается и открывается новый, казалось бы прерывание должно происходить
независимо от состояния клиента  , хотя это не так страшно повис клиент и его поток повис, хуже что  из 10 потоков три всеж не закрылись.
Ладно потрачу еще некоторое время потом буду думать над сменой платформы. Всем Спасибо.
PM MAIL   Вверх
shamber
Дата 3.7.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



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


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

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


 




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


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

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