Cinnamon -Экран остается разблокированным через 1 секунду после открытия крышки / возобновления приостановки

Вызовы exec*()просто запускают программу и передают ей аргументы командной строки. Базовый системный вызов не знает, что должны означать аргументы, это зависит от запущенного процесса.

Вы можете использовать exec*()для запуска оболочки, совместимой с POSIX -, и передать ей эту командную строку, например. с execl("/bin/sh", "/bin/sh", "-c", "echo hello && mkdir testing", (char *) NULL).Тогда оболочка запустит mkdirтолько в том случае, если echoзавершится успешно.

Но так как ваше задание состояло в том, чтобы реализовать оболочку и оператор &&самостоятельно, выполнение этого путем вызова внешней, уже существующей оболочки, на самом деле не соответствует духу задания. Вы можете просто использовать какую-нибудь существующую оболочку для начала и не писать ни одной строки кода на C.

0
05.04.2021, 00:45
1 ответ

Сначала я попытался использовать метод, указанный в https://bbs.archlinux.org/viewtopic.php?id=166221, так как он полностью описывал мою проблему. Однако подход, который они использовали, заключался в привязке клавиш к сценарию, который вручную запускал команду блокировки перед инициированием приостановки.

В моей ситуации лучше всего было изменить файл модуля systemd в /usr/lib/systemd/system/systemd-suspend.serviceи заменить содержимое раздела [Service]следующим:

[Service]
Type=oneshot
ExecStart=/usr/bin/sleep 2
ExecStart=/lib/systemd/systemd-sleep suspend

Таким образом, ОС будет спать 2 секунды, давая время процессу корицы завершить блокировку экрана, прежде чем отправить команду на приостановку. Type=oneshotуже присутствовал, что означает, что несколько полей ExecStart=разрешены и что они будут выполняться последовательно, а не параллельно, что позволяет приостановить работу перед отправкой команды приостановки.

0
28.04.2021, 22:54

Теги

Похожие вопросы