На всякий случай, если кому-то интересно, как на самом деле работает pmset sleepnow
, он использует IOPMSleepSystem API из раздела «Управление питанием» платформы IOKit. Вы можете проверить это, изучив исходный код pmset.c (ссылка из macOS 10.13.3).
Таким образом, вместо вызова pmset
вы можете запросить сон через следующий фрагмент:
#include <IOKit/pwr_mgt/IOPMLib.h>
void SleepNow()
{
io_connect_t fb = IOPMFindPowerManagement(MACH_PORT_NULL);
if (fb != MACH_PORT_NULL)
{
IOPMSleepSystem(fb);
IOServiceClose(fb);
}
}
Не пугайтесь, что вызывающий должен быть пользователем root или замечание пользователя консоли замечание в документации, поскольку оно работает для любого стандартного зарегистрированного пользователя.
Следуя исходному коду, похоже, что он вызывает IOUserClient::clientHasPrivilege
с kIOClientPrivilegeLocalUser
, что в итоге проверяет, присутствует ли вызывающий объект в массиве IOConsoleUsers
в корневой записи IORegistry и, по-видимому, в данный момент зарегистрирован пользователь всегда присутствовать там.