Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 15

Сигналы. Зачем использовать флаг SA_RESTART?

12.03.2011, 15:46. Показов 7156. Ответов 35
Метки нет (Все метки)

Зачем использовать флаг SA_RESTART, если он поддерживается "некоторыми" системами для "некоторых" системных вызовов? Не надежней ли делать проверку на наличие EINTR?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2011, 15:46
Ответы с готовыми решениями:

Сигналы DoubleClicked() и флаг Qt::ItemIsSelectable для QTableWidget
Столкнулся с непонятным для себя поведением виджета при использовании флага Qt::ItemIsSelectable, а именно если его устанавливать для опр....

Зачем нужен флаг в реализации алгоритма Флойда?
Здравствуйте, наткнулся на реализацию алгоритма Флойда и у меня возник вопрос, за что отвечает флаг в цикле? while (1) { int flag...

Зачем использовать def
Зачем использовать "def:" при объявлении функции, если есть "lambda"?

35
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.03.2011, 22:02
Цитата Сообщение от neurosis Посмотреть сообщение
Я имею ввиду, почему бы не забить на SA_RESTART, и сделать, например, функции-обертки для сис. вызовов... ну типа того
Если не сделаешь SA_RESTART, то после обработки сигнала программа помрёт. Вроде бы как. Ты лучше скажи, что ты в конечном итоге хочешь увидеть
0
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 15
14.03.2011, 00:24  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Если не сделаешь SA_RESTART, то после обработки сигнала программа помрёт.
Чо?
SA_RESTART
Поведение должно соответствовать семантике сигналов BSD и позволять некоторым системным вызовам работать, в то время как идет обработка сигналов.
Источник: http://www.opennet.ru/man.shtm... %D4%D8+man
Ты лучше скажи, что ты в конечном итоге хочешь увидеть
Хочу быть уверенным в том, что если какой-нибудь сис. вызов (accept() например) прервется сигналом, то он будет перезапущен
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 08:34
Цитата Сообщение от neurosis Посмотреть сообщение
Чо?
Я несколько криво выразился. У каждого сигнала есть дефолтное поведение, которое выражается либо в игнорировании сигнала, либо в прибитии процесса. Может есть ещё какое-то дефолтное поведение, но навскидку не вспомню

Цитата Сообщение от neurosis Посмотреть сообщение
Хочу быть уверенным в том, что если какой-нибудь сис. вызов (accept() например) прервется сигналом, то он будет перезапущен
А о каком сигнале идёт речь? Если это внешний сигнал типа SIGINT, то программа умрёт, ибо это дефолтное поведение сигнала

А вообще, по таким сложным вещам крайне НЕ рекомендую читать русскоязычные переводы. Или по крайней мере перевод без оригинала под рукой. Не раз уже встречался с тем, что русский вариант невозможно понять, либо переведено формально правильно, но с возможной двоякой трактовкой и первая трактовка, которая приходит на ум, оказывается неверной
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 09:27
Цитата Сообщение от neurosis Посмотреть сообщение
Хочу быть уверенным в том, что если какой-нибудь сис. вызов (accept() например) прервется сигналом, то он будет перезапущен
Вы же сами прекрасно понимаете, что SA_RESTART вам этой уверенности не даст т.к. accept() перезапускается далеко не везде и не всегда.
Т.е. его именно оборачиваем по типу как вы показали для read() с добавками по вкусу типа ловли EAGAIN, учета ожидающих соединений и тд.

Добавлено через 7 минут
Цитата Сообщение от Evg Посмотреть сообщение
А о каком сигнале идёт речь? Если это внешний сигнал типа SIGINT, то программа умрёт, ибо это дефолтное поведение сигнала
Все чудеснее и чудеснее становиться, но после перла "Если не сделаешь SA_RESTART" не вставляет)
Сможете поведать что такое "внешний" сигнал, и очевидно "внутренний"? Ну или хотя бы разницу между ними.
И почему код должен помирать от SIGINT? это же не SIGKILL...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 11:29
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Сможете поведать что такое "внешний" сигнал, и очевидно "внутренний"?
Любишь ты разводить клоунаду на ровном месте. Тебе, очевидно, куда больше нравится асбтрактно препираться и меряться, чем отвечать человеку на конкретный вопрос

"Внешний" сигнал - сигнал, вызванный "внешними" по отношению к задаче причинами: пользователь нажал Ctrl-C, пользователь набрал в консоли kill, другая программа (в том числе и родственная программа, или поток) послала сигнал. "Внутренние" сигналы возникают по причинам, вызыванным работой саой программы: программа сама себе послал сигнал, программа выполнила недопустимую операцию, программа нарвалась на плавающее исключение и т.п.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 11:56
Мне казалось, что по сути я ответил в 1м посте и ТС ответ удовлетворил...
Могу повторить если нас читают "танкисты":
Я считаю, что смысл использовать SA_RESTART при написании нового портабельного кода (а не адаптации старого BSD4) есть _только_ в одном случае - не возможность проверить EINTR. Во всех остальных случаях его использовать _не_ надо т.к. учет поведение всего зоопарка современных ОС потребует неоправданно много труда на разработку и отладку.
Наиболее простая, а потому более надежная стратегия запрещать сигналы в критических местах кода.

Если вы с этим не согласны, то я с _удовольствием_ выслушаю аргументы.
А пока от вас слышно только "вопроса я не понял", словоблудие на тему "не читайте советских газет" и весьма вольный пересказ ман sigaction

"Внешний" сигнал - сигнал, вызванный "внешними" по отношению к задаче причинами: пользователь нажал Ctrl-C, пользователь набрал в консоли kill, другая программа (в том числе и родственная программа, или поток) послала сигнал. "Внутренние" сигналы возникают по причинам, вызыванным работой саой программы: программа сама себе послал сигнал, программа выполнила недопустимую операцию, программа нарвалась на плавающее исключение и т.п.
Вы забыли пояснить самое главное: какая разница _кто_ послал сигнал???
Как (непонятно зачем) введенное вами разделение сигналов на "внутренние" и "внешние" влияет на поведение SA_RESTART или на EINTR или на что-то еще?
Может программа не упадет если пошлет сама себе _любой_ не запрещенный сигнал для которого не установлен обработчик? так нет.
Может "внешние" сигналы надо обрабатывать как-то по особенному? так тоже нет.
В чем же разница???
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 13:04
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Могу повторить если нас читают "танкисты":
Я считаю, что смысл использовать SA_RESTART при написании нового портабельного кода (а не адаптации старого BSD4) есть _только_ в одном случае - не возможность проверить EINTR. Во всех остальных случаях его использовать _не_ надо т.к. учет поведение всего зоопарка современных ОС потребует неоправданно много труда на разработку и отладку.
А не судьба было сразу вот так написать? По крайней мере хоть что-то внтяно написанное, которое можно прочитать и понять

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Вы забыли пояснить самое главное: какая разница _кто_ послал сигнал???
Я, например, не имею чёткого представления о том, что конкретно из себя представляет постановка задачи у топикстартера. С какими сигналами и при каких условиях возникающими борется автор. Поэтому предпочитаю обсуждение конкретной проблемы, а не абстрактной
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 13:40
Цитата Сообщение от Evg Посмотреть сообщение
А не судьба было сразу вот так написать? По крайней мере хоть что-то внтяно написанное, которое можно прочитать и понять
Поймите, очевидно человек задающий подобный вопрос _априори_ знает и понимает о чем идет речь.
И рассусоливать ему разницу между BSD и SVR способами работы с сигналами _не_ нужно.
Наверное дело в том, что вы не читали Стивенса (его можно добыть и в оригинале, но поверьте на слово, перевод адекватный).
Я, например, не имею чёткого представления о том, что конкретно из себя представляет постановка задачи у топикстартера. С какими сигналами и при каких условиях возникающими борется автор. Поэтому предпочитаю обсуждение конкретной проблемы, а не абстрактной
Давайте по пунктам:
1. Какие сигналы:
это не важно, для _любого_ сигнала который можно перехватить поведение в контексте SA_RESTART будет одинаковым.
2. Условия возникновения:
И это не важно. Т.к. если сигнал явным образом не блокирован программой поведение системы _не_ измениться в независимости от того кто и как этот сигнал не послал.
3. Собственно сискол который может быть прерван:
Да тут есть, о чем говорить. Как уже минимум 3раза писалось в этом топике тут полные разброд и шатания у разных ОС. А учитывая качество man'ов отстающих от реальности на годы, дело вообще плохо. Именно это и есть основной довод против применения SA_RESTART.
В качестве прикола в свое время в comp.unix.programmer утверждали, что ранний линукс мог вернуть EINTR на sigaction()
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 14:37
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
1. Какие сигналы:
это не важно, для _любого_ сигнала который можно перехватить поведение в контексте SA_RESTART будет одинаковым.
Одинаковым по сравнению с чем?

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
2. Условия возникновения:
И это не важно. Т.к. если сигнал явным образом не блокирован программой поведение системы _не_ измениться в независимости от того кто и как этот сигнал не послал.
Можно поставить обработчик SIGINT (грубо говоря, реакция на Ctrl-C). Можно настроить обработчик таким образом, что он понимает, что программа в данный момент выполняет критическую операцию и прерываться нельзя (но если ничего критического нет, то можно и прерваться). Такой обработчик должен быть настроен через SA_RESTART. А если при получении Ctrl-C мы всегда будем завершаться, но при этом обработчик согнала нам нужен для каких-то посмертных действий, то настраиваем обработчик без SA_RESTART
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 15:01
Цитата Сообщение от Evg Посмотреть сообщение
Одинаковым по сравнению с чем?
Как следует из названия пункта №1 с __любым__ другим перехватываемым сигналом.
Цитата Сообщение от Evg Посмотреть сообщение
Можно поставить обработчик SIGINT (грубо говоря, реакция на Ctrl-C). Можно настроить обработчик таким образом, что он понимает, что программа в данный момент выполняет критическую операцию и прерываться нельзя (но если ничего критического нет, то можно и прерваться). Такой обработчик должен быть настроен через SA_RESTART.
Простите, но последнее предложение мягко говоря весьма спорно.
Фактически этим вы утверждаете, что такого же поведения не добиться проверкой на EINTR.
Что очевидно является не правдой.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 15:31
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Как следует из названия пункта №1 с __любым__ другим перехватываемым сигналом
Сравниваем-то мы вариант с SA_RESTART и без него. А не два разных сигнала с SA_RESTART

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Фактически этим вы утверждаете, что такого же поведения не добиться проверкой на EINTR
Я ничего не утверждаю. Я просто привёл пример одной из жизненных ситуаций.

А вот обрабатывать 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
Цитата Сообщение от Evg Посмотреть сообщение
Сравниваем-то мы вариант с SA_RESTART и без него. А не два разных сигнала с SA_RESTART
К чему тогда все ваше юление на тему "а какой конкретно сигнал ловит ТС???
Я ничего не утверждаю. Я просто привёл пример одной из жизненных ситуаций.
Так не пишите должен, пишите может. И объясняйте чем это лучше проверки EINTR. Иначе это переливание из пустого в порожнее.
Цитата Сообщение от Evg Посмотреть сообщение
А вот обрабатывать EINTR - это уже вопрос второго уровня: если у нас нет сигналов с SA_RESTART, то EINTR вроде бы как и незачем обрабатвывать (потому что таких ситуаций быть не должно).
Простите, но это уже откровенный бред. Все с точность до наоборот. Как раз с SA_RESTART на некоторых сисколах вы EINTR и не увидите. И по этому если у нас нет сигналов с SA_RESTART то обрабатывать EINTR как раз надо. Впрочем и с SA_RESTART тоже надо тк опять же не все сисколы могут быть перезапущенны.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 16:04
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
К чему тогда все ваше юление на тему "а какой конкретно сигнал ловит ТС???
Ты можешь с людьми нормально общаться или принципиально себя ведёшь по-хамски? Между мной и тобой разница в том, что я разговариваю, а ты споришь. А потому свои замашки типа "юление" оставь для своей жены (когда она у тебя появится). Я всего лишь пытаюсь понять, что конкртено хочет автор

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Как раз с SA_RESTART на некоторых сисколах вы EINTR и не увидите
А на некоторых увижу? Или что? Опять-таки хочу тебе напомнить. Я не спорю, я спрашиваю

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
И по этому если у нас нет сигналов с SA_RESTART то обрабатывать EINTR как раз надо
Действительно, я напутал
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 16:27
Цитата Сообщение от Evg Посмотреть сообщение
Ты можешь с людьми нормально общаться или принципиально себя ведёшь по-хамски? Между мной и тобой разница в том, что я разговариваю, а ты споришь. А потому свои замашки типа "юление" оставь для своей жены (когда она у тебя появится). Я всего лишь пытаюсь понять, что конкртено хочет автор
Извините, я не хотел вас обидеть (и например не тыкаю вам в отличии от). Если бы вы производили впечатление студента я бы, изначально писал вам иначе, разжевывая и поясняя каждый шаг. Я же предположил (возможно ошибочно) что вы в курсе вопроса... Так что оставьте в покое мою семью и давайте начнем с начала.
Цитата Сообщение от Evg Посмотреть сообщение
А на некоторых увижу? Или что? Опять-таки хочу тебе напомнить. Я не спорю, я спрашиваю
Да. некоторые сисколы система при установленном SA_RESTART перезапустит и соответственно EINTR вы не увидите, другие же перезапустить не возможно (например connect) и соответственно вернет EINTR. Списки перезапускаемых сисколов можно глянуть в районе man 7 signal, man 2 signal, man sigaction или рядом в зависимости от системы.
Попробую резюмировать специально для вас.
1. Любой доставленный сигнал без флага SA_RESTART прервет любой сискол (ну или покрайней мере тот у которого в мане прописан EINTR)
2. Есле же для сигнала был установлен флаг SA_RESTART то тут начинаются неоднозначности.
Часть сисколов не будут перезапущенны и система вернет EINTR как для случая 1 (для портабельного приложения критично то, что конкретный список таких сисколов различен для разных систем.) Т.е. получается, что при использовании SA_RESTART мы все равно должны проверять EINTR.
Отсюда и вопрос ТС "а нафига тогда вообще использовать SA_RESTART". Ответ на него вы вроди видели.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2011, 17:02
Остался только один вопрос. Ты говоришь "перезапущен", но фактически это означает "доисполнить до конца начиная с точки прерывания" (другими словами, будет исполно так, как будто бы сигнала и не было)? Или всё-таки что-то другое (с ходу, например, не понятно, почему с connect'ом должны быть проблемы)?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.03.2011, 17:21
Цитата Сообщение от Evg Посмотреть сообщение
Остался только один вопрос. Ты говоришь "перезапущен", но фактически это означает "доисполнить до конца начиная с точки прерывания" (другими словами, будет исполно так, как будто бы сигнала и не было)? Или всё-таки что-то другое (с ходу, например, не понятно, почему с connect'ом должны быть проблемы)?
Тут как раз именно та ситуация, когда говорить абстрактно (не о конкретном сисколе) тяжело.
Например тот же read()/write() если успел хоть что-то прочитать/записать перезапускаться не будет, а вернет то что успел сделать на момент получения сигнала.
Конретно про connect там устроенно так (линукс):
C
1
2
3
4
5
6
7
8
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
        /* Error code is set above */
        if (!timeo || !inet_wait_for_connect(sk, timeo))
            goto out;
        err = sock_intr_errno(timeo);
        if (signal_pending(current))
            goto out;
    }
Т.е. даже если коннект был блокируемый, система все равно поставит его в бэкграунд, и вернет EINTR
Для нас, прикладных программистов, это значит что если мы словили EINTR на сonnect() то придется делать poll/select на сокет. т.е. работать с ним как с не блокируемым.
Почему такие пляски? Подозреваю, что из-за TCP handshake, но утверждать не буду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2011, 17:21

Интерфейсы зачем их использовать
Извиняюсь что создал тему, просто не могу понять зачем . Сейчас учу интерфейсы, и не могу понять зачем их использовать, если все равно...

Зачем нужно использовать Action?
Один знакомый любит использовать Action. Так, меня заинтересовала эта тема. Зачем нужно использовать Action? И когда их нужно использовать?

Зачем в фреймворках использовать модели?
Здравствуйте, я использую фреймворк CodeIgniter и на данный момент весь сайт неплохо помещается в контроллере, и я бы хотел узнать может я...

Зачем использовать динамическую память?
Прошу в двух словах разъяснить зачем используют динамическую память на практике. Заранее всем добрым людям спс!

Namespace - зачем его использовать
Извините за тупой вопрос, не как не могу понят зачем так писать: namespace Hello{ class Hello Wolrd { public static void Main() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
[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. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru