Я пишу приложение на C для Mac (Leopard), которое должно выполнить некоторую работу по получению уведомлений о питании, например, сон, пробуждение, выключение, перезапуск. Он запускается через launchd
в качестве агента запуска при входе в систему, а затем начинает мониторинг уведомлений. Код, который я использую для этого, выглядит следующим образом:
/* ask for power notifications */
static void StartPowerNotification(void)
{
static io_connect_t rootPort;
IONotificationPortRef notificationPort;
io_object_t notifier;
rootPort = IORegisterForSystemPower(&rootPort, ¬ificationPort,
PowerCallback, ¬ifier);
if (!rootPort)
exit (1);
CFRunLoopAddSource (CFRunLoopGetCurrent(),
IONotificationPortGetRunLoopSource(notificationPort),
kCFRunLoopDefaultMode);
}
/* perform actions on receipt of power notifications */
void PowerCallback (void *rootPort, io_service_t y,
natural_t msgType, void *msgArgument)
{
switch (msgType)
{
case kIOMessageSystemWillSleep:
/* perform sleep actions */
break;
case kIOMessageSystemHasPoweredOn:
/* perform wakeup actions */
break;
case kIOMessageSystemWillRestart:
/* perform restart actions */
break;
case kIOMessageSystemWillPowerOff:
/* perform shutdown actions */
break;
}
}
Однако, только два лучших для сна и бодрствования (kIOMessageSystemWillSleep
и kIOMessageSystemHasPoweredOn
) когда-либо вызывают. Я никогда не получаю никаких уведомлений о перезапуске или выключении (kIOMessageSystemWillRestart
и kIOMessageSystemWillPowerOff
).
Я что-то не так делаю? Или есть другой API, который дал бы мне уведомления о перезагрузке и выключении? Я бы предпочел сохранить его как программу на C (как это я знаю), но я открыт для любых разумных предложений альтернатив (я рассмотрел хуки входа / выхода из системы, но, похоже, они устарели в пользу из launchd).
Заранее спасибо за любую помощь / советы!