# Инструкция по сборке и запуску ## Лабораторная работа №3: Многозадачное программирование в Linux ### Описание задания Программа запускает программу из лабораторной работы №1 в нескольких дочерних процессах для обработки множества входных файлов параллельно. **Вариант 12**: Замена первого символа каждой строки на пробелы (до достижения лимита замен). --- ## Структура проекта ``` lab3/ ├── parent.c # Родительская программа (многозадачная) ├── lab1_var12.c # Программа из лабораторной работы №1 ├── Makefile # Makefile для сборки └── README.md # Эта инструкция ``` --- ## Сборка проекта ### 1. Компиляция всех программ ```bash make ``` Будут созданы: - `parent` — родительская программа - `lab1_var12` — программа обработки текста из лабы №1 ### 2. Сборка отдельных программ ```bash make parent # только родительская программа make lab1_var12 # только программа из лабы №1 ``` --- ## Использование ### Формат запуска ```bash ./parent <программа> <вход1> <выход1> [<вход2> <выход2> ...] ``` **Параметры:** - `<программа>` — путь к программе lab1_var12 - `` — максимальное количество замен символов - `<вход1>` `<выход1>` — пары входной/выходной файл (можно несколько) ### Пример 1: Обработка трёх файлов ```bash ./parent ./lab1_var12 10 input1.txt output1.txt input2.txt output2.txt input3.txt output3.txt ``` ### Пример 2: Обработка одного файла ```bash ./parent ./lab1_var12 5 test.txt result.txt ``` --- ## Автоматические тесты ### Базовый тест (создание тестовых файлов и запуск) ```bash make test ``` Создаёт три тестовых входных файла, запускает обработку и показывает результаты. ### Тест обработки ошибок: несуществующий входной файл ```bash make test_error ``` ### Тест обработки ошибок: неверная программа ```bash make test_bad_program ``` ### Тест обработки ошибок: неверные аргументы ```bash make test_bad_args ``` --- ## Примеры работы программы ### Успешное выполнение ``` $ ./parent ./lab1_var12 10 input1.txt output1.txt input2.txt output2.txt === Запуск родительского процесса === Родительский PID: 12345 Программа для запуска: ./lab1_var12 Максимум замен: 10 Количество файловых пар: 2 Создание процесса 1 для файлов: input1.txt -> output1.txt -> Дочерний процесс PID=12346 запускает обработку input1.txt Создание процесса 2 для файлов: input2.txt -> output2.txt -> Дочерний процесс PID=12347 запускает обработку input2.txt === Ожидание завершения дочерних процессов === Процесс PID=12346 завершен (input1.txt -> output1.txt) Код завершения: 0 Статус: SUCCESS Процесс PID=12347 завершен (input2.txt -> output2.txt) Код завершения: 0 Статус: SUCCESS === Итоговая статистика === Всего запущено процессов: 2 Успешно завершено: 2 Завершено с ошибкой: 0 ОБЩИЙ СТАТУС: Все процессы завершены успешно ``` ### Обработка ошибок #### 1. Недостаточно аргументов ``` $ ./parent ./lab1_var12 5 ERROR: Недостаточное или неверное количество аргументов Usage: ./parent [ ...] Example: ./parent ./lab1_var12 5 in1.txt out1.txt in2.txt out2.txt ``` #### 2. Несуществующий входной файл ``` $ ./parent ./lab1_var12 5 nonexistent.txt output.txt === Запуск родительского процесса === ... Создание процесса 1 для файлов: nonexistent.txt -> output.txt -> Дочерний процесс PID=12351 запускает обработку nonexistent.txt open input failed: nonexistent.txt: No such file or directory Процесс PID=12351 завершен (nonexistent.txt -> output.txt) Код завершения: 255 Статус: ERROR (не удалось выполнить) === Итоговая статистика === Всего запущено процессов: 1 Успешно завершено: 0 Завершено с ошибкой: 1 ОБЩИЙ СТАТУС: Завершено с ошибками ``` #### 3. Невозможность запустить программу ``` $ ./parent ./nonexistent_program 5 input.txt output.txt === Запуск родительского процесса === ... ERROR: Не удалось запустить программу ./nonexistent_program: No such file or directory Процесс PID=12355 завершен (input.txt -> output.txt) Код завершения: 255 Статус: ERROR (не удалось выполнить) ``` --- ## Функциональность родительской программы ### Основные возможности: 1. **Создание дочерних процессов** — используется `fork()` 2. **Запуск программы в дочернем процессе** — используется `execl()` 3. **Ожидание завершения процессов** — используется `waitpid()` 4. **Получение кодов завершения** — макросы `WIFEXITED()`, `WEXITSTATUS()`, `WIFSIGNALED()` 5. **Обработка исключительных ситуаций**: - Недостаточное количество аргументов - Невозможность создать процесс (fork failed) - Невозможность запустить программу (exec failed) - Ошибки при обработке файлов ### Коды завершения: - **0** — успешное выполнение - **-1 (255)** — ошибка (невозможно открыть файл, неверные аргументы и т.д.) - **Другие коды** — различные ошибки --- ## Очистка ```bash make clean ``` Удалит: - Исполняемые файлы (`parent`, `lab1_var12`) - Все тестовые входные/выходные файлы --- ## Технические детали ### Системные вызовы: - `fork()` — создание дочернего процесса - `execl()` — запуск программы в дочернем процессе - `waitpid()` — ожидание завершения дочернего процесса - `getpid()` — получение PID текущего процесса ### Обработка статусов: - `WIFEXITED(status)` — процесс завершился нормально - `WEXITSTATUS(status)` — код завершения процесса - `WIFSIGNALED(status)` — процесс завершён сигналом - `WTERMSIG(status)` — номер сигнала ### Компилятор: - GCC версии 4.0 или выше - Флаги: `-Wall -Wextra -std=c99 -g` --- ## Автор Лабораторная работа №3 Системное программирование в Linux Вариант 12