Проектная лаборатория

Собственный Shell

0 / 76этапов пройдено

Этап 53 · Фоновые задания

Обработка завершения перед следующим приглашением

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

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

Обработка завершившихся заданий перед каждым приглашением

До этого оболочка обрабатывала завершившиеся задания только при вызове встроенной команды jobs. На этом этапе вы добавите автоматическую обработку перед каждым приглашением.

Перед выводом приглашения $ ваша оболочка должна:

  1. Проверить, завершились ли какие-либо фоновые задания.
  2. Вывести строку Done для каждого завершившегося задания.
  3. Удалить эти задания из таблицы заданий.
  4. Вывести приглашение.

Таким образом, завершившиеся задания отображаются автоматически, без вызова jobs. Записи Done появляются между выводом команды и следующим приглашением.

Например:

$ sleep 5 & 
[1] 10637
$ sleep 100 & 
[2] 10638
 
# After job 1 completes, run any command
$ echo "Hello world"
Hello world
[1]-  Done                    sleep 5
$ 
 
# The jobs builtin no longer shows job 1 (already reaped)
$ jobs
[2]+  Running                 sleep 100 &

Обратите внимание: строка Done появляется после вывода команды, но перед следующим приглашением.

Две точки обработки завершившихся заданий

Теперь оболочка обрабатывает завершившиеся задания в двух местах:

  1. Перед каждым приглашением: проверяет завершившиеся задания после любой команды (внешней на переднем плане, встроенной, фонового запуска или даже пустого ввода).
  2. Внутри встроенной команды jobs: проверяет завершившиеся задания перед выводом списка.

В обоих местах используется одна и та же логика: проверить завершившиеся задания, отобразить их со статусом Done, затем удалить из таблицы. Запись Done для каждого задания появляется ровно один раз — при автоматической обработке или вызове jobs, смотря что произойдёт раньше.

Проверки

Тестирующая система запустит вашу программу следующим образом:

$ ./your_program.sh

Затем система запустит несколько фоновых заданий, завершит некоторые из них и выполнит команду jobs:

# Start two background jobs
$ sleep 500 &
[1] <pid>
$ cat /path/to/fifo &
[2] <pid>
 
# Check jobs - both should be running
$ jobs
[1]-  Running                 sleep 500 &
[2]+  Running                 cat /path/to/fifo &
 
# The tester writes to the FIFO (in a separate process) to make job 2 exit
# Then run a command - the Done line appears before the next prompt
$ echo banana
banana
[2]+  Done                    cat /path/to/fifo
$ 
 
# Check jobs - job 2 should be removed, only job 1 remains
$ jobs
[1]+  Running                 sleep 500 &

Тестирующая система проверит, что:

  • Строка Done появляется после вывода команды и перед следующим приглашением.
  • Обработанные завершившиеся задания удаляются из таблицы заданий.
  • Последующие вызовы jobs не показывают уже обработанные задания.
  • После обработки маркеры пересчитываются правильно.

Примечания

  • При обработке завершившегося задания оно отображается как Done ровно один раз, а затем удаляется из таблицы.
  • Автоматическая обработка и встроенная команда jobs используют одну и ту же логику.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init shell ./my-shell --language go

2. Откройте папку в IDE

cd ./my-shell

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage bv8

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста