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

8.3 KiB
Raw Blame History

Инструкция по сборке и запуску

Лабораторная работа №3: Многозадачное программирование в Linux

Описание задания

Программа запускает программу из лабораторной работы №1 в нескольких дочерних процессах для обработки множества входных файлов параллельно.

Вариант 12: Замена первого символа каждой строки на пробелы (до достижения лимита замен).


Структура проекта

lab3/
├── parent.c              # Родительская программа (многозадачная)
├── lab1_var12.c          # Программа из лабораторной работы №1
├── Makefile              # Makefile для сборки
└── README.md             # Эта инструкция

Сборка проекта

1. Компиляция всех программ

make

Будут созданы:

  • parent — родительская программа
  • lab1_var12 — программа обработки текста из лабы №1

2. Сборка отдельных программ

make parent        # только родительская программа
make lab1_var12    # только программа из лабы №1

Использование

Формат запуска

./parent <программа> <max_замен> <вход1> <выход1> [ход2> <выход2> ...]

Параметры:

  • <программа> — путь к программе lab1_var12
  • <max_замен> — максимальное количество замен символов
  • ход1> <выход1> — пары входной/выходной файл (можно несколько)

Пример 1: Обработка трёх файлов

./parent ./lab1_var12 10 input1.txt output1.txt input2.txt output2.txt input3.txt output3.txt

Пример 2: Обработка одного файла

./parent ./lab1_var12 5 test.txt result.txt

Автоматические тесты

Базовый тест (создание тестовых файлов и запуск)

make test

Создаёт три тестовых входных файла, запускает обработку и показывает результаты.

Тест обработки ошибок: несуществующий входной файл

make test_error

Тест обработки ошибок: неверная программа

make test_bad_program

Тест обработки ошибок: неверные аргументы

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) — ошибка (невозможно открыть файл, неверные аргументы и т.д.)
  • Другие коды — различные ошибки

Очистка

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