Files
CS-LABS/lab_3/README-lab3.md
2025-10-21 21:01:32 +07:00

231 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Инструкция по сборке и запуску
## Лабораторная работа №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 <программа> <max_замен> <вход1> <выход1> [ход2> <выход2> ...]
```
**Параметры:**
- `<программа>` — путь к программе lab1_var12
- `<max_замен>` — максимальное количество замен символов
- `<вход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 <lab1_program> <max_replacements> <input1> <output1> [<input2> <output2> ...]
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