400 lines
12 KiB
Markdown
400 lines
12 KiB
Markdown
# Инструкция по запуску Лабораторной работы №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`
|