Ваше приложение прерывается точно в тот момент, когда процессор фактически выполняет код вашего приложения. Ваше приложение постоянно получает время выполнения с помощью планировщика задач, который решает, какое приложение получает процессорное время, на каком ядре и как долго. Когда система действительно переходит в спящий режим, планировщик просто больше не дает времени вашему приложению, таким образом, он останавливает выполнение, где бы он ни находился в данный момент, что может происходить практически везде. Однако ядро должно быть в чистом состоянии. Это означает, что если вы только что сделали вызов в ядро (многие функции libC делают), и этот вызов не находится в какой-то безопасной точке (например, в спящем режиме, в ожидании выполнения условия и т. Д.) Или возможно удерживает критические блокировки ядра (например, воронки), ядро может приостановить спящий режим до тех пор, пока этот вызов не вернется обратно в пространство пользователя или выполнение не достигнет такой безопасной точки, прежде чем оно окончательно отменит ваше приложение из планировщика задач.
Вы можете открыть порт ядра и зарегистрироваться для событий сна / пробуждения. В этом случае ваше приложение получит событие, когда система захочет перейти в спящий режим. У вас есть несколько возможностей. Один - ответить на это, что система может прогрессировать. Еще один - приостановить сон; однако Apple заявляет, что некоторые события могут быть приостановлены не более чем на 30 секунд, после чего система просто продолжит работу, независимо от того, нравится ваше приложение или нет. И, наконец, вы можете отменить его; хотя не все события могут быть отменены. Если система уже решила, что перейдет в спящий режим, вы можете приостановить ее не более чем на 30 секунд или разрешить сразу, вы не можете отменить ее. Однако вы также можете прослушать событие, когда система запрашивает приложения, можно ли сейчас идти спать, и там вы можете ответить «нет», что приведет к отмене сна.
Разница между "Можно ли спать" и "Я собираюсь идти спать" заключается в следующем: первая отправляется, если применяются настройки энергосбережения, то есть если пользователь не двигал мышь или набрал что-нибудь за время, настроенное там. В этом случае система просто спросит, нормальный ли сон. Приложение, такое как Apple DVD Player, скажет «нет», потому что, скорее всего, пользователь смотрит DVD и, таким образом, не взаимодействует с компьютером, тем не менее, нет причин идти спать. OTOH, если пользователь закрывает свою Mac Book, приложения не запрашиваются, система обязательно перейдет в спящий режим и просто сообщит приложениям, у которых теперь есть до 30 секунд, чтобы среагировать на это.
События пробуждения также могут быть довольно интересными. Например. если ваша система активируется, открытые файлы могут быть недоступны (внешний диск отключен) или сетевые сокеты больше не будут работать (сеть изменилась). Таким образом, вы можете повторно инициировать определенные части приложения перед их использованием и столкнуться с ошибками, более или менее ожидаемыми.
Страница Apple, посвященная ловле этих событий.