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

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

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

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

Обработка нескольких завершившихся заданий

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

На этом этапе вы обработаете завершение нескольких фоновых заданий.

Обработка завершения нескольких фоновых заданий

Когда запущено несколько фоновых заданий и часть из них завершается, оболочка должна проверить все задания при следующем вызове jobs.

Пройдите по всем фоновым заданиям и проверьте завершение каждого (используя неблокирующую проверку из предыдущих этапов).

Как и на предыдущих этапах, каждое завершившееся задание появляется в выводе jobs со статусом Done, затем удаляется из таблицы заданий. Следующий вызов jobs больше не покажет эти задания. Перед удалением они отображаются как Done только один раз.

Динамическое обновление маркеров

Маркеры + и - следует пересчитывать после удаления завершившихся заданий. Маркеры всегда основаны на текущем списке заданий, а не на исходных номерах.

Напомним правила назначения маркеров:

  • Задание с наибольшим номером получает + (последнее).
  • Задание со вторым по величине номером получает - (предыдущее).
  • Все остальные получают пробел.

При удалении заданий маркеры смещаются:

$ sleep 100 & 
[1] 10886
$ sleep 5 & 
[2] 10887
$ sleep 6 & 
[3] 10892
 
# After jobs 2 and 3 have completed
$ jobs
[1]   Running                 sleep 100 &
[2]-  Done                    sleep 5
[3]+  Done                    sleep 6
 
# Next jobs call: completed jobs removed, job 1 promoted to +
$ jobs
[1]+  Running                 sleep 100 &

Задание 1 начиналось без маркера (с пробелом), но после удаления заданий 2 и 3 оно остаётся единственным и получает +.

Проверки

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

$ ./your_program.sh

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

# Start three background jobs
$ sleep 500 &
[1] <pid>
$ cat /path/to/fifo1 &
[2] <pid>
$ cat /path/to/fifo2 &
[3] <pid>
 
# Terminate job 2 by writing to its FIFO
$ echo -ne "" > /path/to/fifo1
 
# Check jobs - job 2 should show as Done
$ jobs
[1]   Running                 sleep 500 &
[2]-  Done                    cat /path/to/fifo1
[3]+  Running                 cat /path/to/fifo2 &
 
# Terminate job 3 by writing to its FIFO
$ echo -ne "" > /path/to/fifo2
 
# Check jobs - job 3 should show as Done, job 2 already removed
$ jobs
[1]-  Running                 sleep 500 &
[3]+  Done                    cat /path/to/fifo2
 
# Check jobs - job 2 should be removed, only job 1 remains
$ jobs
[1]+  Running                 sleep 500 &

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

  • Завершившиеся задания появляются в выводе один раз со статусом 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 rq2

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

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

go / ЛОКАЛЬНО

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

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

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

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