Проектная лаборатория
Собственный Shell
Этап 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 go2. Откройте папку в IDE
cd ./my-shellРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage rq2Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.