# Инструкция по запуску Лабораторной работы №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 [ ...] # Обработка одного файла ./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 ./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`