lolopolosko
@lolopolosko

Сигнал перехода в сон Linux?

Можно ли как нибудь узнать с помощью С++ состояние системы?

Нужно выполнить одну функцию перед тем как система перейдет в сон.

Функция предназначена для того чтобы сохранить значение и вытянуть системное время для того чтобы его потом корректно возобновить, так как программа иногда работает не так как ожидается после выхода из сна.
  • Вопрос задан
  • 4115 просмотров
Пригласить эксперта
Ответы на вопрос 3
elenbert
@elenbert
Все можно сделать с помощью шелл скриптов.
Создаете файл, например, 10_myscript с таким содержимым:

#!/bin/sh
case "$1" in
        hibernate|suspend)
                echo "Suspending myscript"
                ;;
        thaw|resume)
                echo "Resuming myscript"
                ;;
        *)
                echo "Unknown command"
                ;;      
esac
exit 0


Сам скрипт помещаете в /etc/pm/sleep.d
Собственно этот скрипт будет выполнятся подсистемой сна/пропуждения. В данном примере-заглушке обрабатываются 4 типа аргументов скрипта. В конкретный кейсах вы можете выполнить все что вам нужно — запустить другую программу с необходимыми аргументами или послать другой программе сообщение через d-bus и т.д.
Ответ написан
Комментировать
ixSci
@ixSci
Когда-то задавался схожим вопросом, но никакого железного решения для всех дистрибутивов не нашел. Сделал через DBus и меня устроило:
Подписываемся
QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Sleeping", this,  SIGNAL(SystemIsGoingToSuspend()));
QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Resuming", this,  SIGNAL(SystemIsGoingToResume()));

Отписываемся:
QDBusConnection::systemBus().disconnect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower",  "Sleeping", this,  SIGNAL(SystemIsGoingToSuspend()));
QDBusConnection::systemBus().disconnect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Resuming", this,  SIGNAL(SystemIsGoingToResume()));

Код использует Qt, но, я думаю, суть должна быть ясна. По наступлении определенного события будет вызван метод SystemIsGoingToSuspend/SystemIsGoingToResume
Ответ написан
@egorinsk
Гораздо логичнее было бы вместо установки костылей из шелл-скриптов исправить вашу программу, чтобы она правильно работала со временем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы