![]() |
|
IT и Связь Обсуждение "айтишных" вопросов и средств связи |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Заслуженный Участник
|
![]()
Такой вопрос меняют ли сигналы или сигал хандлеры значение errno, чтото не могу найти соответсвующий документ.
__________________
Complaining Is Stupid. Either Act or Forget. |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#2 |
Practical UNIX Terrorist
|
![]()
сигналы нет, не меняют.
а что значит - хэндлеры меняют? что в хэндлере напишешь, то и будет делаться. будешь делать что-то, что потенциально изменит errno - знеачит изменит. и это плохо и неправильно, конечно. в хэндлерах такое делать нельзя.
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#3 | |
Заслуженный Участник
|
![]() Цитата:
__________________
Complaining Is Stupid. Either Act or Forget. |
|
![]() |
![]() |
![]() |
#4 |
Practical UNIX Terrorist
|
![]()
что значит "sigterm теряет пакет"?
ты имеешь в виду, что процесс убивают термом и какой-то кусочек не доходит? если write(2) (то есть именно syscall) вернул ok, то нет, такого быть не должно. ядро должно слить буфер.
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#5 | |
Заслуженный Участник
|
![]() Цитата:
__________________
Complaining Is Stupid. Either Act or Forget. |
|
![]() |
![]() |
![]() |
#6 |
Practical UNIX Terrorist
|
![]()
имей в виду, что тредовое приложение и сигналы это 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. |
![]() |
![]() |
![]() |
#7 | |
Заслуженный Участник
|
![]()
Бомбардирую я с шел скрипта, write() точно возвращяет что все ок, иначе бы не сидел на condition_wait и ждал пока другой тред поставит ответ в replycach. A пропадают они ибо, на сервере либо нет соощения что пакет пришел, либо сервер отослал ответ а клиент полчит. Мне думается что проблема гдето по середине а не в этих функциях, бум втыкать диагностикс месаги щаз во все дыры, чыоб получит более точную картину.
Цитата:
![]()
__________________
Complaining Is Stupid. Either Act or Forget. |
|
![]() |
![]() |
![]() |
#8 |
Заслуженный Участник
|
![]()
Короче, проблема решена. Забыл упомянуть что все происходило на солярке. Оказалось что на солярке поменялось поведение 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. |
![]() |
![]() |