Вызовы exec*()
просто запускают программу и передают ей аргументы командной строки. Базовый системный вызов не знает, что должны означать аргументы, это зависит от запущенного процесса.
Вы можете использовать exec*()
для запуска оболочки, совместимой с POSIX -, и передать ей эту командную строку, например. с execl("/bin/sh", "/bin/sh", "-c", "echo hello && mkdir testing", (char *) NULL)
.Тогда оболочка запустит mkdir
только в том случае, если echo
завершится успешно.
Но так как ваше задание состояло в том, чтобы реализовать оболочку и оператор &&
самостоятельно, выполнение этого путем вызова внешней, уже существующей оболочки, на самом деле не соответствует духу задания. Вы можете просто использовать какую-нибудь существующую оболочку для начала и не писать ни одной строки кода на C.
Сначала я попытался использовать метод, указанный в 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=
разрешены и что они будут выполняться последовательно, а не параллельно, что позволяет приостановить работу перед отправкой команды приостановки.