В настоящее время я занимаюсь созданием небольшой оболочки в 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
кажется плохим кодом.
Любая обратная связь приветствуется.