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

12 KiB
Raw Blame History

Инструкция по запуску Лабораторной работы №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. Компиляция

# Компилировать все программы
make -f Makefile_lab4 all

# Или компилировать отдельно:
make -f Makefile_lab4 pipes      # Только pipes
make -f Makefile_lab4 fifo       # Только FIFO
make -f Makefile_lab4 original   # Оригинальная версия

3. Автоматическое тестирование

# Тест с неименованными каналами (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)

Компиляция

gcc -Wall -Wextra -std=c99 -g -o parent_pipe parent_pipe.c
gcc -Wall -Wextra -std=c99 -g -o child_pipe child_pipe.c

Создание тестовых файлов

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

Запуск

# Формат: ./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

Просмотр результатов

cat output1.txt
cat output2.txt
cat output3.txt

Вариант 2: Именованные каналы (FIFO)

Компиляция

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 (Сервер):

./fifo_server 10

Сервер запустится и будет ожидать подключения клиентов.

Терминал 2 (Клиент):

# Формат: ./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: Автоматический запуск (одна команда)

# Сервер запустится в фоне, обработает запросы и автоматически остановится
make -f Makefile_lab4 test_fifo_auto

Вариант 2.3: Ручной запуск в фоне

# Запустить сервер в фоне
./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

Тестирование обработки ошибок

Несуществующий входной файл

# 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

Неверное количество аргументов

# Недостаточно аргументов
./parent_pipe ./child_pipe 5

# Нечетное количество файлов
./parent_pipe ./child_pipe 5 input1.txt

Клиент без сервера (FIFO)

# Попытка подключиться при выключенном сервере
./fifo_client input1.txt output1.txt
# Ожидается: "ERROR: Не удалось открыть FIFO запроса"

Сравнение результатов

Сравнение pipes vs original

# Запустить обе версии
./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

# 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

Анализ работы программ

Просмотр процессов

# Во время работы parent_pipe в другом терминале:
ps aux | grep child_pipe
ps aux | grep parent_pipe

# Просмотр открытых файловых дескрипторов
lsof -c parent_pipe
lsof -c child_pipe

Просмотр FIFO файлов

# Во время работы сервера:
ls -la /tmp/fifo_*

# Информация о типе файла
file /tmp/fifo_request
file /tmp/fifo_response

Трассировка системных вызовов

# Трассировка работы с каналами
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

Очистка

# Удалить скомпилированные программы и тестовые файлы
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" при запуске

Решение:

chmod +x parent_pipe child_pipe fifo_server fifo_client

Проблема 2: FIFO клиент зависает

Причина: Сервер не запущен.

Решение: Убедитесь, что сервер запущен:

ps aux | grep fifo_server

Проблема 3: "Address already in use" для FIFO

Причина: FIFO файлы остались после некорректного завершения.

Решение:

rm -f /tmp/fifo_request /tmp/fifo_response

Проблема 4: Зомби-процессы

Причина: Родительский процесс не вызвал wait() для дочерних.

Решение: В коде уже реализован waitpid(), но если проблема возникла:

# Просмотр зомби
ps aux | grep defunct

# Завершить родительский процесс
killall parent_pipe

Проблема 5: Broken pipe

Причина: Попытка записи в канал, у которого закрыт конец для чтения.

Решение: Убедитесь, что оба конца канала правильно настроены и дочерний процесс не завершился преждевременно.

Дополнительные команды

Справка по использованию

# Показать все доступные команды Makefile
make -f Makefile_lab4 help

Компиляция с отладочной информацией

# Уже включено флагом -g, запуск с gdb:
gdb ./parent_pipe
(gdb) run ./child_pipe 10 input1.txt output1.txt

Проверка утечек памяти

# Для 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