VirtualIreland.ru - Виртуальная Ирландия
Вернуться   VirtualIreland.ru - Виртуальная Ирландия > Живем в Ирландии > IT и Связь

IT и Связь Обсуждение "айтишных" вопросов и средств связи

Ответ
 
Опции темы Опции просмотра
Старый 15.11.2006, 15:00   #1
Заслуженный Участник
 
Аватар для ixania
 
Сообщений: 2,951
Благодарности: 1,004 в 534 сообщениях Поиск благодарностей ixania
По умолчанию About unix signals

Такой вопрос меняют ли сигналы или сигал хандлеры значение errno, чтото не могу найти соответсвующий документ.
__________________
Complaining Is Stupid. Either Act or Forget.
ixania вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 15.11.2006, 20:22   #2
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию

сигналы нет, не меняют.
а что значит - хэндлеры меняют? что в хэндлере напишешь, то и будет делаться. будешь делать что-то, что потенциально изменит errno - знеачит изменит.
и это плохо и неправильно, конечно. в хэндлерах такое делать нельзя.
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 16.11.2006, 10:10   #3
Заслуженный Участник
 
Аватар для ixania
 
Сообщений: 2,951
Благодарности: 1,004 в 534 сообщениях Поиск благодарностей ixania
По умолчанию

Цитата:
Сообщение от rojer
сигналы нет, не меняют.
а что значит - хэндлеры меняют? что в хэндлере напишешь, то и будет делаться. будешь делать что-то, что потенциально изменит errno - знеачит изменит.
и это плохо и неправильно, конечно. в хэндлерах такое делать нельзя.
Ну понятно что в самом хелдлере ет уже дело програмиста, я думал при вызове хендлера там чтото еще происходит за кулисами. Кстати не встречался с ситуацией када SIGTERM теряет гдето сетевой пакет, при том что вызов write () возвращает что все ОК.
__________________
Complaining Is Stupid. Either Act or Forget.
ixania вне форума   Ответить с цитированием
Старый 16.11.2006, 10:28   #4
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию

что значит "sigterm теряет пакет"?
ты имеешь в виду, что процесс убивают термом и какой-то кусочек не доходит?
если write(2) (то есть именно syscall) вернул ok, то нет, такого быть не должно. ядро должно слить буфер.
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 16.11.2006, 10:58   #5
Заслуженный Участник
 
Аватар для ixania
 
Сообщений: 2,951
Благодарности: 1,004 в 534 сообщениях Поиск благодарностей ixania
По умолчанию

Цитата:
Сообщение от rojer
что значит "sigterm теряет пакет"?
ты имеешь в виду, что процесс убивают термом и какой-то кусочек не доходит?
если write(2) (то есть именно syscall) вернул ok, то нет, такого быть не должно. ядро должно слить буфер.
Согласен, write(2) signal safe, но вот при бомбардировке процесса с 2 тредами SIGTERM-ами, то получается что терется то при посылке то при приеме, причем в треде который принимает я маскирую SIGTERM, тоесть его этот сигнал не должен волновать особенно, хотя под дебагером я вижу что кернел рестартит select(). Ну а вот первый уже отвечает на SIGTERM, причем интересно получается, если я цепляю обработчик на SIGTERM , то тогда все и происходит, без обработчика приложение закрывается коректно, в обработчике ничего не делаю, тоесть он пустой.
__________________
Complaining Is Stupid. Either Act or Forget.
ixania вне форума   Ответить с цитированием
Старый 16.11.2006, 11:16   #6
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию

имей в виду, что тредовое приложение и сигналы это whole different can of worms.
тем не менее. ты хочешь сказать, что твой тред-писатель вызывает write(2), оно возвращает ok, и всё равно данные пропадают?
и select тут ни при чём. select и его рестарт не повлияют на то, что уже было записано в сокет (если было, конечно). сделай процессу strace и посмотри, происходит ли реально вызов write(2) с теми данными, которые, ты считаешь, теряются.
и ещё, as a side note. ты говоришь о бомбардировке сигналами. а не надо бомбардировать сигналами :) если ты очень часто ловишь или отправляешь сигналы, это неправильный дизайн.
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 16.11.2006, 11:26   #7
Заслуженный Участник
 
Аватар для ixania
 
Сообщений: 2,951
Благодарности: 1,004 в 534 сообщениях Поиск благодарностей ixania
По умолчанию

Бомбардирую я с шел скрипта, write() точно возвращяет что все ок, иначе бы не сидел на condition_wait и ждал пока другой тред поставит ответ в replycach. A пропадают они ибо, на сервере либо нет соощения что пакет пришел, либо сервер отослал ответ а клиент полчит. Мне думается что проблема гдето по середине а не в этих функциях, бум втыкать диагностикс месаги щаз во все дыры, чыоб получит более точную картину.

Цитата:
ы говоришь о бомбардировке сигналами. а не надо бомбардировать сигналами если ты очень часто ловишь или отправляешь сигналы, это неправильный дизайн.
А что деларь если клиенты уроды написали систему которая подсела на сигнаы как на наркоту, вот и над вылизывать код похлеще чем в приложениях на космичеких кораблях
__________________
Complaining Is Stupid. Either Act or Forget.
ixania вне форума   Ответить с цитированием
Старый 17.11.2006, 13:09   #8
Заслуженный Участник
 
Аватар для ixania
 
Сообщений: 2,951
Благодарности: 1,004 в 534 сообщениях Поиск благодарностей ixania
По умолчанию

Короче, проблема решена. Забыл упомянуть что все происходило на солярке. Оказалось что на солярке поменялось поведение cond_wait(), оно теперь не гарантирует что охраняющий мутекс будет залочен, если функция будет прервана сигналом и сигнал будет иметь зарегестрированый обработчик, тоесть при выполнении обработчика статус мутекса неопределен, вот в этом месте и появляется шанс прозевать сигнал. А так как наш код надеелся на обратное, так как писался во времена солярки 8, он реентрил в cond_wait() без проверки если condition has beеn met, тоесть чтото вроде этого:
Код:
int ret = 0;
    do
    {
        ret = cond_dwait(&m_cond, &l->m_mutex);
    }
    while (ret == EINTR);
Вот линки по теме:
http://bugs.opensolaris.org/bugdatab...bug_id=4454327
http://technopark02.blogspot.com/200...2_archive.html
http://supportforum.sun.com/jive/thr...801&tstart=150

rojer спасибо за потдержку
__________________
Complaining Is Stupid. Either Act or Forget.
ixania вне форума   Ответить с цитированием
Ответ



Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете добавлять вложения
Вы не можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT, времени сейчас: 07:24.


vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd., Русификация: zCarot, Vovan & Co
©2003-2025 VirtualIreland.ru - Виртуальная Ирландия