Files
CS-LABS/lab_4/Инструкция_по_запуску.md
2025-10-28 17:00:14 +07:00

400 lines
12 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.
# Инструкция по запуску Лабораторной работы №4
## Быстрый старт
### 1. Подготовка файлов
Создайте рабочую директорию и поместите в неё следующие файлы:
- `parent_pipe.c` - родительская программа (pipes)
- `child_pipe.c` - дочерняя программа (pipes)
- `fifo_server.c` - серверная программа (FIFO)
- `fifo_client.c` - клиентская программа (FIFO)
- `Makefile_lab4` - Makefile для компиляции
- Оригинальные файлы: `parent.c`, `lab1_var12.c`, `Makefile` (для сравнения)
### 2. Компиляция
```bash
# Компилировать все программы
make -f Makefile_lab4 all
# Или компилировать отдельно:
make -f Makefile_lab4 pipes # Только pipes
make -f Makefile_lab4 fifo # Только FIFO
make -f Makefile_lab4 original # Оригинальная версия
```
### 3. Автоматическое тестирование
```bash
# Тест с неименованными каналами (pipes)
make -f Makefile_lab4 test_pipes
# Автоматический тест с именованными каналами (FIFO)
make -f Makefile_lab4 test_fifo_auto
# Сравнение с оригинальной версией
make -f Makefile_lab4 test_compare
# Запустить все тесты
make -f Makefile_lab4 test_all
```
## Подробные инструкции
### Вариант 1: Неименованные каналы (Pipes)
#### Компиляция
```bash
gcc -Wall -Wextra -std=c99 -g -o parent_pipe parent_pipe.c
gcc -Wall -Wextra -std=c99 -g -o child_pipe child_pipe.c
```
#### Создание тестовых файлов
```bash
echo "abbaabbaabbaabbaabbaabbaabbaabba" > input1.txt
echo "xyzxyzxyzxyzxyzxyzxyzxyz" >> input1.txt
echo "hello world hello" >> input1.txt
echo "testtest" > input2.txt
echo "aaaaaaa" >> input2.txt
echo "programming" > input3.txt
echo "ppppython" >> input3.txt
```
#### Запуск
```bash
# Формат: ./parent_pipe <child_program> <max_replacements> <in1> <out1> [<in2> <out2> ...]
# Обработка одного файла
./parent_pipe ./child_pipe 10 input1.txt output1.txt
# Обработка нескольких файлов параллельно
./parent_pipe ./child_pipe 10 input1.txt output1.txt input2.txt output2.txt input3.txt output3.txt
# Разные лимиты замен
./parent_pipe ./child_pipe 5 input1.txt output1_5.txt
./parent_pipe ./child_pipe 20 input1.txt output1_20.txt
```
#### Просмотр результатов
```bash
cat output1.txt
cat output2.txt
cat output3.txt
```
### Вариант 2: Именованные каналы (FIFO)
#### Компиляция
```bash
gcc -Wall -Wextra -std=c99 -g -o fifo_server fifo_server.c
gcc -Wall -Wextra -std=c99 -g -o fifo_client fifo_client.c
```
#### Вариант 2.1: Запуск в двух терминалах
**Терминал 1 (Сервер):**
```bash
./fifo_server 10
```
Сервер запустится и будет ожидать подключения клиентов.
**Терминал 2 (Клиент):**
```bash
# Формат: ./fifo_client <input_file> <output_file>
./fifo_client input1.txt output1_fifo.txt
./fifo_client input2.txt output2_fifo.txt
./fifo_client input3.txt output3_fifo.txt
```
После обработки всех файлов остановите сервер: Ctrl+C в терминале 1.
#### Вариант 2.2: Автоматический запуск (одна команда)
```bash
# Сервер запустится в фоне, обработает запросы и автоматически остановится
make -f Makefile_lab4 test_fifo_auto
```
#### Вариант 2.3: Ручной запуск в фоне
```bash
# Запустить сервер в фоне
./fifo_server 10 &
SERVER_PID=$!
# Подождать запуска сервера
sleep 1
# Отправить запросы
./fifo_client input1.txt output1_fifo.txt
./fifo_client input2.txt output2_fifo.txt
./fifo_client input3.txt output3_fifo.txt
# Остановить сервер
kill $SERVER_PID
```
## Тестирование обработки ошибок
### Несуществующий входной файл
```bash
# Pipes
./parent_pipe ./child_pipe 5 nonexistent.txt output.txt
# FIFO
./fifo_server 5 &
sleep 1
./fifo_client nonexistent.txt output.txt
killall fifo_server
```
### Неверное количество аргументов
```bash
# Недостаточно аргументов
./parent_pipe ./child_pipe 5
# Нечетное количество файлов
./parent_pipe ./child_pipe 5 input1.txt
```
### Клиент без сервера (FIFO)
```bash
# Попытка подключиться при выключенном сервере
./fifo_client input1.txt output1.txt
# Ожидается: "ERROR: Не удалось открыть FIFO запроса"
```
## Сравнение результатов
### Сравнение pipes vs original
```bash
# Запустить обе версии
./parent_pipe ./child_pipe 10 input1.txt output1_pipe.txt
./parent ./lab1_var12 10 input1.txt output1_orig.txt
# Сравнить результаты
diff output1_pipe.txt output1_orig.txt
# Если различий нет - программа работает корректно
```
### Сравнение FIFO vs pipes
```bash
# Pipes
./parent_pipe ./child_pipe 10 input1.txt output1_pipe.txt
# FIFO
./fifo_server 10 &
sleep 1
./fifo_client input1.txt output1_fifo.txt
killall fifo_server
# Сравнение
diff output1_pipe.txt output1_fifo.txt
```
## Анализ работы программ
### Просмотр процессов
```bash
# Во время работы parent_pipe в другом терминале:
ps aux | grep child_pipe
ps aux | grep parent_pipe
# Просмотр открытых файловых дескрипторов
lsof -c parent_pipe
lsof -c child_pipe
```
### Просмотр FIFO файлов
```bash
# Во время работы сервера:
ls -la /tmp/fifo_*
# Информация о типе файла
file /tmp/fifo_request
file /tmp/fifo_response
```
### Трассировка системных вызовов
```bash
# Трассировка работы с каналами
strace -e trace=pipe,read,write,fork,execl ./parent_pipe ./child_pipe 10 input1.txt output1.txt
# Трассировка FIFO операций
strace -e trace=open,read,write,mkfifo ./fifo_server 10
```
## Очистка
```bash
# Удалить скомпилированные программы и тестовые файлы
make -f Makefile_lab4 clean
# Или вручную:
rm -f parent_pipe child_pipe fifo_server fifo_client
rm -f parent lab1_var12
rm -f input*.txt output*.txt
rm -f /tmp/fifo_request /tmp/fifo_response
```
## Типичные проблемы и решения
### Проблема 1: "Permission denied" при запуске
**Решение:**
```bash
chmod +x parent_pipe child_pipe fifo_server fifo_client
```
### Проблема 2: FIFO клиент зависает
**Причина:** Сервер не запущен.
**Решение:** Убедитесь, что сервер запущен:
```bash
ps aux | grep fifo_server
```
### Проблема 3: "Address already in use" для FIFO
**Причина:** FIFO файлы остались после некорректного завершения.
**Решение:**
```bash
rm -f /tmp/fifo_request /tmp/fifo_response
```
### Проблема 4: Зомби-процессы
**Причина:** Родительский процесс не вызвал wait() для дочерних.
**Решение:** В коде уже реализован waitpid(), но если проблема возникла:
```bash
# Просмотр зомби
ps aux | grep defunct
# Завершить родительский процесс
killall parent_pipe
```
### Проблема 5: Broken pipe
**Причина:** Попытка записи в канал, у которого закрыт конец для чтения.
**Решение:** Убедитесь, что оба конца канала правильно настроены и дочерний процесс не завершился преждевременно.
## Дополнительные команды
### Справка по использованию
```bash
# Показать все доступные команды Makefile
make -f Makefile_lab4 help
```
### Компиляция с отладочной информацией
```bash
# Уже включено флагом -g, запуск с gdb:
gdb ./parent_pipe
(gdb) run ./child_pipe 10 input1.txt output1.txt
```
### Проверка утечек памяти
```bash
# Для pipes
valgrind --leak-check=full ./parent_pipe ./child_pipe 10 input1.txt output1.txt
# Для FIFO сервера
valgrind --leak-check=full ./fifo_server 10
```
## Примеры вывода
### Успешное выполнение pipes
```
=== Запуск родительского процесса с каналами ===
Родительский PID: 12345
Программа для запуска: ./child_pipe
Максимум замен: 10
Количество файловых пар: 2
Создание процесса 1 для файлов: input1.txt -> output1.txt
Создание процесса 2 для файлов: input2.txt -> output2.txt
=== Обработка файлов через каналы ===
Обработка процесса PID=12346 (input1.txt -> output1.txt)
Отправлено байт: 87
Получено байт: 87
Количество замен: 10
Статус: SUCCESS
Обработка процесса PID=12347 (input2.txt -> output2.txt)
Отправлено байт: 17
Получено байт: 17
Количество замен: 6
Статус: SUCCESS
=== Итоговая статистика ===
Всего запущено процессов: 2
Успешно завершено: 2
Завершено с ошибкой: 0
ОБЩИЙ СТАТУС: Все процессы завершены успешно
```
### Успешное выполнение FIFO
```
=== FIFO Server запущен ===
Server PID: 12350
Максимум замен: 10
FIFO каналы созданы:
Request: /tmp/fifo_request
Response: /tmp/fifo_response
Ожидание запросов от клиентов...
Получен запрос: 87 байт
Выполнено замен: 10
Отправлен ответ: 87 байт
```
```
=== FIFO Client ===
Client PID: 12351
Входной файл: input1.txt
Выходной файл: output1.txt
Прочитано байт из файла: 87
Отправка запроса серверу...
Отправлено байт: 87
Ожидание ответа от сервера...
Получено байт от сервера: 100
Записано байт в выходной файл: 87
Количество выполненных замен: 10
Обработка завершена успешно!
```
## Контакты и поддержка
При возникновении вопросов обратитесь к:
- Отчету лабораторной работы (PDF)
- Комментариям в исходном коде
- Документации Linux man pages: `man pipe`, `man mkfifo`, `man fork`, `man dup2`