В настоящее время я работаю над созданием небольшой оболочки в C ++.
Пользователь может вводить задание по приглашению, например exe1 && exe2 &
.Подобно оболочке BASH, я выполню exe2
, только если exe1
успешно завершится.Кроме того, вся работа должна выполняться в фоновом режиме (как указано в конце оператора &
).
Сейчас у меня есть jobManager
, который обрабатывает выполнение заданий, и структура job
который содержит исполняемый файл задания и его отдельные аргументы / условия.Задание начинается с вызова fork()
и последующего вызова execvp()
с надлежащими аргументами.Когда работа заканчивается, у меня есть обработчик сигнала для SIGCHLD
, в котором я выполняю wait()
, чтобы определить, какой процесс только что закончился.Когда exe1
заканчивается, я наблюдаю код его выхода и решаю, стоит ли мне начинать запуск exe2
.
Меня беспокоит, как мне запустить exe2
.Я обеспокоен тем, что, если я использую свою функцию запуска jobManager из контекста моего обработчика SIGCHLD
, я могу получить слишком много функций обработчика SIGCHLD
, висящих в стеке (например, если было 10 условных выполнений).Кроме того, не очень хорошая идея начинать следующее выполнение из обработчика сигнала, даже если это происходит косвенно.(Я пытался сделать что-то подобное 1,5 года назад, когда я только учился обрабатывать сигналы - похоже, я вспомнил, что мне это не удалось).
Все вышеперечисленное должно происходить в фоновом режиме, и яЯ хочу избежать того, чтобы jobManager
сидел в напряженном ожидании, ожидая возвращения exe1
.Я также предпочел бы, чтобы отдельный поток не сидел без дела, просто ожидая начала выполнения другого процесса.Однако указание моему jobManager
начать выполнение следующего процесса из обработчика SIGCHLD
выглядит как плохой код.
Любая обратная связь оценивается.