Я использую оперативный сигнал в Linux, который будет уведомлен относительно прибытия новых данных в последовательном порту. К сожалению, это заставляет вызовы сна быть прерванными, когда существует сигнал.
Кто-либо знает о способе избежать этого поведения?
Я пытался использовать регулярный сигнал (SIGUSR1), но я продолжаю получать то же поведение.
Из справочной страницы nanosleep:
nanosleep задерживает выполнение программы по крайней мере на время, указанное в * req. Функция может вернуться раньше, если процессу был доставлен сигнал. В этом случае он возвращает -1, устанавливает для errno значение EINTR и записывает оставшееся время в структуру, на которую указывает rem, если rem не равно NULL. Затем значение * rem можно использовать для повторного вызова nanosleep и завершения указанной паузы.
Можно создать категорию «Выполнить вручную» для тестов с помощью атрибута 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 ()
. Первый возвращает предыдущую маску, которую можно восстановить после сна ()
. Некоторые примеры - здесь . Если это не помогает, пожалуйста, будьте более подробны о том, какой сигнал прерывает ваш сон. Думаю, можно дополнительно проверить это состояние («сон прерван сигналом?») и снова впасть в сон.
Что ж, сигнал в реальном времени должен прерывать сон. Вместо этого вы можете использовать сигнал не в реальном времени. Другой подход состоит в том, чтобы проверить, истекло ли ожидаемое время до сна, и если нет, то спите оставшийся интервал.
Если вы не хотите, чтобы вас прерывали, почему вы используете сигнал в реальном времени?
Где-то в "Расширенном программировании Unix" Рокинда. или книгу Стивена, был пример того, как это выдумать. Вы записываете текущее значение time_t перед тем, как засыпать. По окончании сна вы проверяете, истекло ли необходимое количество времени, и если этого не произошло, вы начинаете новый сон. Включите режим сна в цикл, который вычисляет оставшееся время и количество сна, которое завершается по прошествии необходимого времени.
Новые ядра Linux поддерживают signalfd (2) . Вместе с sigprocmask (2) это очень хороший способ объединить обработку сигналов и событий ввода-вывода в одном вызове epoll_wait (2) .