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