Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прерывание connect() по таймеру, удается через раз :( 
V
    Опции темы
ivzel
Дата 1.8.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Стоит задача сделать таймаут для TCP-соединения. Используется следующая конструкция.
Код

struct sigaction sa, sa_old;
sa.sa_handler = timer_alarm;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGALRM, &sa, &sa_old) == -1) return 2;

struct itimerval timerstruct;
timerstruct.it_interval.tv_sec=0;
timerstruct.it_interval.tv_usec=0;
timerstruct.it_value.tv_sec=0;
timerstruct.it_value.tv_usec=200000;

if(all_ok && (setitimer(ITIMER_REAL,&timerstruct,NULL)==0))
{
    //try to connect
    if(connect(sock, (struct sockaddr*)&addr, sizeof(addr))==0){
    ...
    }
}

В отдельном приложении эта конструкция работает так, как и ожидалось (мноюsmile): при долгом соединении connect() прерывается с errno=EINTR. Однако при использовании этого кода в качестве функции в динамической библиотеке (.so), таймер хотя и срабатывает, однако же connect продолжает выполняться (в итоге, я конечно, получаю errno=ETIMEDOUT, но ведь через 3 минуты, а не через 200мс!). 
Такое впечатление, что установлен SA_RESTART, хотя по идее же я все флаги для сигнала сбрасываю в строчке:
Код

 sa.sa_flags = 0;


Одним словом: что я делаю не так?!  
PM MAIL   Вверх
svlary
Дата 2.8.2011, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ivzel @  1.8.2011,  19:22 Найти цитируемый пост)
при использовании этого кода в качестве функции в динамической библиотеке (.so), таймер хотя и срабатывает,

   Подозреваю, что дело не в том, что "в динамической библиотеке", а в том, что в отдельном потоке. Есть у Вас p_thread ? В доке написано, что при доставке сигнала в процесс, состоящий из НЕСКОЛЬКИХ нитей, куда именно попадет этот сигнал - ничем не определяется...
PM MAIL   Вверх
ivzel
Дата 2.8.2011, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ответ. 
В самой библиотеке потоков-нитей нет. Однако по всей видимости ответ где-то тут рядом smile Дело в том, что как оказалось, я не совсем верно сформулировал проблему. smile Когда функция вызывается из моего приложения она, оказывается, таки работает как положено. Проблема наблюдается только при её вызове в качестве хранимой процедуры Firebird. 
Посему, наверное, тему можно прикрывать и открывать её на форуме собственно Firebird'a :(
Ещё раз спасибо.

P.S. Однако если у вас найдутся идеи для экспериментов, то я только "за"  smile 

Это сообщение отредактировал(а) ivzel - 2.8.2011, 06:22
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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