|
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 15
|
|
Сигналы. Зачем использовать флаг SA_RESTART?12.03.2011, 15:46. Показов 7156. Ответов 35
Метки нет (Все метки)
Зачем использовать флаг SA_RESTART, если он поддерживается "некоторыми" системами для "некоторых" системных вызовов? Не надежней ли делать проверку на наличие EINTR?
0
|
|
| 12.03.2011, 15:46 | |
|
Ответы с готовыми решениями:
35
Сигналы DoubleClicked() и флаг Qt::ItemIsSelectable для QTableWidget Зачем нужен флаг в реализации алгоритма Флойда? Зачем использовать def |
|
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 15
|
||||
| 14.03.2011, 00:24 [ТС] | ||||
0
|
||||
|
|
|||
| 14.03.2011, 08:34 | |||
|
А вообще, по таким сложным вещам крайне НЕ рекомендую читать русскоязычные переводы. Или по крайней мере перевод без оригинала под рукой. Не раз уже встречался с тем, что русский вариант невозможно понять, либо переведено формально правильно, но с возможной двоякой трактовкой и первая трактовка, которая приходит на ум, оказывается неверной
0
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 14.03.2011, 09:27 | |||
|
Т.е. его именно оборачиваем по типу как вы показали для read() с добавками по вкусу типа ловли EAGAIN, учета ожидающих соединений и тд. Добавлено через 7 минут Сможете поведать что такое "внешний" сигнал, и очевидно "внутренний"? Ну или хотя бы разницу между ними. И почему код должен помирать от SIGINT? это же не SIGKILL...
0
|
|||
|
|
||
| 14.03.2011, 11:29 | ||
|
"Внешний" сигнал - сигнал, вызванный "внешними" по отношению к задаче причинами: пользователь нажал Ctrl-C, пользователь набрал в консоли kill, другая программа (в том числе и родственная программа, или поток) послала сигнал. "Внутренние" сигналы возникают по причинам, вызыванным работой саой программы: программа сама себе послал сигнал, программа выполнила недопустимую операцию, программа нарвалась на плавающее исключение и т.п.
0
|
||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 14.03.2011, 11:56 | ||
|
Мне казалось, что по сути я ответил в 1м посте и ТС ответ удовлетворил...
Могу повторить если нас читают "танкисты": Я считаю, что смысл использовать SA_RESTART при написании нового портабельного кода (а не адаптации старого BSD4) есть _только_ в одном случае - не возможность проверить EINTR. Во всех остальных случаях его использовать _не_ надо т.к. учет поведение всего зоопарка современных ОС потребует неоправданно много труда на разработку и отладку. Наиболее простая, а потому более надежная стратегия запрещать сигналы в критических местах кода. Если вы с этим не согласны, то я с _удовольствием_ выслушаю аргументы. А пока от вас слышно только "вопроса я не понял", словоблудие на тему "не читайте советских газет" и весьма вольный пересказ ман sigaction
Как (непонятно зачем) введенное вами разделение сигналов на "внутренние" и "внешние" влияет на поведение SA_RESTART или на EINTR или на что-то еще? Может программа не упадет если пошлет сама себе _любой_ не запрещенный сигнал для которого не установлен обработчик? так нет. Может "внешние" сигналы надо обрабатывать как-то по особенному? так тоже нет. В чем же разница???
0
|
||
|
|
|||
| 14.03.2011, 13:04 | |||
|
0
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 14.03.2011, 13:40 | |||
|
И рассусоливать ему разницу между BSD и SVR способами работы с сигналами _не_ нужно. Наверное дело в том, что вы не читали Стивенса (его можно добыть и в оригинале, но поверьте на слово, перевод адекватный).
1. Какие сигналы: это не важно, для _любого_ сигнала который можно перехватить поведение в контексте SA_RESTART будет одинаковым. 2. Условия возникновения: И это не важно. Т.к. если сигнал явным образом не блокирован программой поведение системы _не_ измениться в независимости от того кто и как этот сигнал не послал. 3. Собственно сискол который может быть прерван: Да тут есть, о чем говорить. Как уже минимум 3раза писалось в этом топике тут полные разброд и шатания у разных ОС. А учитывая качество man'ов отстающих от реальности на годы, дело вообще плохо. Именно это и есть основной довод против применения SA_RESTART. В качестве прикола в свое время в comp.unix.programmer утверждали, что ранний линукс мог вернуть EINTR на sigaction()
0
|
|||
|
|
|||
| 14.03.2011, 14:37 | |||
|
0
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 14.03.2011, 15:01 | |||
|
Фактически этим вы утверждаете, что такого же поведения не добиться проверкой на EINTR. Что очевидно является не правдой.
0
|
|||
|
|
|||
| 14.03.2011, 15:31 | |||
|
А вот обрабатывать EINTR - это уже вопрос второго уровня: если у нас нет сигналов с SA_RESTART, то EINTR вроде бы как и незачем обрабатвывать (потому что таких ситуаций быть не должно). Если имеются обработчики с SA_RESTART, значит в программе мы должны учесть такую возможность. Если мы знаем, что по SIGINT'у мы отложим завершение работы только в том случае, если формируется файл сданными, то нам, мягко говоря, плевать на EINTR'ы, возникшие в accept'ах. Если мы будем откладывать завершение до того момента, пока не прочтём все данные из сети, то приработе с read нам надо заложить возможность возникновения EINTR'а. Потому я и говорю, что хотелось бы обсудить конкретную причину в конкретной задаче
0
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||||
| 14.03.2011, 15:51 | ||||
0
|
||||
|
|
||||
| 14.03.2011, 16:04 | ||||
|
0
|
||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 14.03.2011, 16:27 | |||
|
Попробую резюмировать специально для вас. 1. Любой доставленный сигнал без флага SA_RESTART прервет любой сискол (ну или покрайней мере тот у которого в мане прописан EINTR) 2. Есле же для сигнала был установлен флаг SA_RESTART то тут начинаются неоднозначности. Часть сисколов не будут перезапущенны и система вернет EINTR как для случая 1 (для портабельного приложения критично то, что конкретный список таких сисколов различен для разных систем.) Т.е. получается, что при использовании SA_RESTART мы все равно должны проверять EINTR. Отсюда и вопрос ТС "а нафига тогда вообще использовать SA_RESTART". Ответ на него вы вроди видели.
1
|
|||
|
|
|
| 14.03.2011, 17:02 | |
|
Остался только один вопрос. Ты говоришь "перезапущен", но фактически это означает "доисполнить до конца начиная с точки прерывания" (другими словами, будет исполно так, как будто бы сигнала и не было)? Или всё-таки что-то другое (с ходу, например, не понятно, почему с connect'ом должны быть проблемы)?
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||||||
| 14.03.2011, 17:21 | |||||||
|
Например тот же read()/write() если успел хоть что-то прочитать/записать перезапускаться не будет, а вернет то что успел сделать на момент получения сигнала. Конретно про connect там устроенно так (линукс):
Для нас, прикладных программистов, это значит что если мы словили EINTR на сonnect() то придется делать poll/select на сокет. т.е. работать с ним как с не блокируемым. Почему такие пляски? Подозреваю, что из-за TCP handshake, но утверждать не буду.
0
|
|||||||
| 14.03.2011, 17:21 | |
|
Зачем в фреймворках использовать модели? Зачем использовать динамическую память? Namespace - зачем его использовать Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool
Worker Pool — паттерн конкурентной обработки задач в Go.
Суть: фиксированное количество горутин-воркеров читают задачи из общего канала
и пишут результаты в общий канал результатов. . . .
|
|
[golang] Pipeline
alhaos 08.06.2026
Pipeline
Pipeline — паттерн конкурентной обработки данных в Go.
Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|