Su aplicación se interrumpe exactamente donde está ese momento si la CPU actualmente está ejecutando el código de su aplicación. Su aplicación obtiene constantemente tiempo de ejecución por el programador de tareas, que decide qué aplicación obtiene el tiempo de CPU, en qué núcleo y durante cuánto tiempo. Una vez que el sistema realmente se queda dormido, el programador simplemente no le da tiempo a su aplicación por más tiempo, por lo que detendrá la ejecución donde sea que esté en ese momento, lo que puede ocurrir prácticamente en todas partes. Sin embargo, el kernel debe estar limpio. Eso significa que si acaba de hacer una llamada al kernel (muchas funciones de libC lo hacen) y esta llamada no está en un punto seguro (por ejemplo, dormir, esperar que una condición se convierta en verdad, etc.) o mantener bloqueos críticos del kernel (ej. embudos), el kernel puede suspender el reposo hasta que esta llamada regrese al espacio del usuario o la ejecución llegue a tal punto seguro antes de que finalmente cancele su aplicación del programador de tareas.
Puede abrir un puerto kernel y registrarse para eventos de reposo/activación. En ese caso, su aplicación recibirá un evento cuando el sistema quiera irse a dormir. Tienes varias posibilidades.Una es responder a ella, que el sistema puede progresar. Otro es suspender el sueño; sin embargo, Apple dice que ciertos eventos pueden suspenderse a lo sumo 30 segundos, luego de eso, el sistema continuará, independientemente de si a su aplicación le gusta o no. Y finalmente, puedes cancelarlo; aunque no todos los eventos pueden ser cancelados. Si el sistema ya decidió que va a dormir, solo puede suspenderlo por un máximo de 30 segundos o permitirlo de inmediato, no puede cancelarlo. Sin embargo, también puede escuchar un evento, donde el sistema le pregunta a las aplicaciones, si está bien ir a dormir ahora y allí puede responder "no", lo que hace que se cancele un sueño.
La diferencia entre "¿Está bien dormir" y "Estoy pensando en ir a dormir" es: la primera se envía si se aplica la configuración de ahorro de energía, es decir, si el usuario no se ha movido el mouse o tipeado algo para el tiempo configurado allí. En ese caso, el sistema solo preguntará, si el sueño está bien. Una aplicación como el reproductor de DVD de Apple dirá "no" porque lo más probable es que el usuario mire un DVD y, por lo tanto, no interactúe con la computadora, aún no hay motivo para irse a dormir. OTOH, si el usuario cierra su Mac Book, no se le preguntan las aplicaciones, el sistema se dormirá con seguridad y solo informa a las aplicaciones, que ahora tienen hasta 30 segundos para reaccionar.
Los eventos de despertador también pueden ser muy interesantes de atrapar. P.ej. si su sistema se activa, es posible que no se pueda acceder a los archivos abiertos (se desenchufó una unidad externa) o que los conectores de red ya no funcionen (la red ha cambiado). Por lo tanto, puede volver a iniciar ciertas partes de la aplicación antes de usarlas y ejecutar errores que son más o menos esperados.
Apple's page regarding catching these events.
Pero no tendría precedentes para el sistema operativo para solicitar que la aplicación se suspende, a continuación, obliga a que si no lo hace en un período de tiempo especificado. Así que a los buenos ciudadanos se les permite limpiar y a los malos ciudadanos no se les permite crear problemas. – benzado