Как избежать, чтобы прерывание сна звонило из-за сигнала в Linux?

Я использую оперативный сигнал в Linux, который будет уведомлен относительно прибытия новых данных в последовательном порту. К сожалению, это заставляет вызовы сна быть прерванными, когда существует сигнал.

Кто-либо знает о способе избежать этого поведения?

Я пытался использовать регулярный сигнал (SIGUSR1), но я продолжаю получать то же поведение.

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 28 April 2018 в 10:33
поделиться

5 ответов

Из справочной страницы nanosleep:

nanosleep задерживает выполнение программы по крайней мере на время, указанное в * req. Функция может вернуться раньше, если процессу был доставлен сигнал. В этом случае он возвращает -1, устанавливает для errno значение EINTR и записывает оставшееся время в структуру, на которую указывает rem, если rem не равно NULL. Затем значение * rem можно использовать для повторного вызова nanosleep и завершения указанной паузы.

14
ответ дан 4 December 2019 в 07:14
поделиться

Можно создать категорию «Выполнить вручную» для тестов с помощью атрибута Category, а затем исключить эту категорию из тестов в графическом интерфейсе пользователя. Эти тесты будут выделены серым цветом, и вы можете поместить их обратно, когда захотите. Я часто делаю это для медленных тестов.

-121--2283858-

Вы можете использовать следующее:

validates_uniqueness_of :name, :case_sensitive => false

Обратите внимание, что по умолчанию настройка is:case_sensitive = > false, поэтому даже не нужно писать этот параметр, если вы не изменили другие способы.

Дополнительную информацию можно найти по адресу: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of

-121--609606-

Маскировать можно практически все сигналы (кроме SIGKILL ) с помощью вызовов sigprocmask () или signal () . Первый возвращает предыдущую маску, которую можно восстановить после сна () . Некоторые примеры - здесь . Если это не помогает, пожалуйста, будьте более подробны о том, какой сигнал прерывает ваш сон. Думаю, можно дополнительно проверить это состояние («сон прерван сигналом?») и снова впасть в сон.

8
ответ дан 4 December 2019 в 07:14
поделиться

Что ж, сигнал в реальном времени должен прерывать сон. Вместо этого вы можете использовать сигнал не в реальном времени. Другой подход состоит в том, чтобы проверить, истекло ли ожидаемое время до сна, и если нет, то спите оставшийся интервал.

2
ответ дан 4 December 2019 в 07:14
поделиться

Если вы не хотите, чтобы вас прерывали, почему вы используете сигнал в реальном времени?

Где-то в "Расширенном программировании Unix" Рокинда. или книгу Стивена, был пример того, как это выдумать. Вы записываете текущее значение time_t перед тем, как засыпать. По окончании сна вы проверяете, истекло ли необходимое количество времени, и если этого не произошло, вы начинаете новый сон. Включите режим сна в цикл, который вычисляет оставшееся время и количество сна, которое завершается по прошествии необходимого времени.

2
ответ дан 4 December 2019 в 07:14
поделиться

Новые ядра Linux поддерживают signalfd (2) . Вместе с sigprocmask (2) это очень хороший способ объединить обработку сигналов и событий ввода-вывода в одном вызове epoll_wait (2) .

5
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: