Проектная лаборатория
Собственный Shell
Этап 51 · Фоновые задания
Обработка одного завершившегося задания
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы расширите встроенную команду jobs для обработки завершившихся фоновых заданий.
Обработка завершившихся фоновых заданий
Сейчас, когда фоновый процесс вашей оболочки завершается, он становится зомби-процессом: выполнение окончено, но запись остаётся в таблице процессов, пока родительский процесс не подтвердит завершение. Оболочка должна получить сведения о завершении этих процессов, чтобы очистить их записи.
Когда пользователь запускает jobs, оболочка должна:
- Проверить, завершилось ли каждое фоновое задание.
- Если задание завершилось, отобразить его со статусом
Doneв текущем выводе. - Удалить задание
Doneиз таблицы заданий, чтобы оно не появлялось при следующих вызовахjobs.
Например:
$ sleep 1 &
[1] 84470
# After ~1 second, the process has exited
$ jobs
[1]+ Done sleep 1
# The next jobs call shows nothing (job was removed)
$ jobs
$Обратите внимание: у записи Done нет завершающего &, в отличие от записей Running.
Обнаружение завершения процесса
Механизм проверки завершения каждого фонового задания зависит от языка, но общий подход заключается в проверке состояния процесса без ожидания его завершения.
Например:
- В C/Unix: используйте
waitpid(pid, &status, WNOHANG)и проверьтеWIFEXITED(status). - В Python: используйте
subprocess.Popen.poll()и проверьте, что код завершения не равенNone. - В Node.js: прослушивайте событие
exitдочернего процесса.
На этом этапе обрабатывайте только нормальное завершение. О процессах, убитых сигналами или остановленных, пока не беспокойтесь. Достаточно определить нормальное завершение процесса.
Проверки
Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.shЗатем система запустит фоновое задание и проверит его с помощью jobs:
$ cat /path/to/fifo &
[1] 84470
$ jobs
[1]+ Running cat /path/to/fifo &
$ Тестирующая система запишет данные в FIFO, чтобы процесс cat завершился:
$ echo -ne "" > /path/to/fifoСледующий вызов jobs должен показать завершившееся задание:
$ jobs
[1]+ Done cat /path/to/fifoСледующий после этого вызов jobs не должен ничего показать:
$ jobs
$ Тестирующая система проверит, что:
- Первый вызов
jobsпоказывает задание какRunningс завершающим&. - Второй вызов
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 go2. Откройте папку в IDE
cd ./my-shellРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ma9Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.