Как я могу узнать, реализован ли режим сна с помощью будильника в моей системе в perl? - PullRequest
3 голосов
/ 31 августа 2011

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

Я могу обнаружить это, используя этот конвейер оболочки (идея из этого другого вопроса ):

strace perl -e 'sleep 1' 2>&1 | grep 'sleep\|alarm'

Если спящий режим реализован с помощью будильника, на выходе вы увидите системный вызов будильника. В противном случае вы увидите другой системный вызов сна, подобный следующему из Ubuntu 10.04.2:

execve("/usr/bin/perl", ["perl", "-e", "sleep 1"], [/* 26 vars */]) = 0
nanosleep({1, 0}, 0xbfacba54)           = 0

Тем не менее, я ищу краткий чистый Perl-код (предпочтительно один строчный), чтобы обнаружить его вместе с тем, что вы должны ожидать увидеть, если тревога лежит в основе сна, и что ожидать, если это не так.

Примечание:

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

1 Ответ

6 голосов
/ 31 августа 2011

Запись в Википедии на SIGALRM гласит:

[SIGALRM] иногда используется для реализации функции сна; следовательно, программы не могут надежно использовать будильник для «пробуждения» от задержки, вызванной сном .

Исходя из этого, я предполагаю, что следующее обнаружит, если сон реализован по тревоге:

 perl -e 'alarm 1; sleep 2; print "slept\n"';

Если спящий режим реализован с помощью аварийного сигнала, выход будет «спящим», поскольку вызов в спящий режим сбросит аварийный сигнал и возьмет на себя обработку нового SIGALRM, когда он прибудет. Если спящий режим реализован другим способом, на выходе будет «Будильник», показывающий, что обработчик тревоги по умолчанию сработал.

К сожалению, я не могу проверить этот случай, потому что я не нашел систему, которая реализует сон по тревоге.

(Интересно, что в статье в Википедии приводится документация по perl для функции сна)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...