Операционные системы ← ЛабораторныеЛабораторная работа №1

Создание процессов

Изучить системные вызовы fork, exec*, wait, open, close, dup/dup2 и написать минимальную версию интерпретатора команд shell. Интерпретатор должен последовательно запускать указанные программы и поддерживать предусмотренное вариантом расширение. Синтаксис команд заимствовать из любого широко известного интерпретатора команд (bash, csh, rc). Программа не должна игнорировать ошибки открытия файлов при перенаправлении ввода/вывода при замещении образа процесса.

Варианты заданий.

  1. Перенаправление стандартного ввода
  2. Перенаправление стандартного вывода.
  3. Конвеер.
  4. Запуск программ в фоновом режиме и встроенная команда fg.
  5. Запуск программ с заданным набором переменных окружения.
  6. Встроенная команда exec.

↓Практическая работа 1.1

  1. Вспомнить (или изучить) основные команды оболочки Юникса, позволяющие что-то делать с работающими процессами: ps, top, jobs, fg, bg, kill, exec.
  2. Изучить системные вызовы и средства libc для работы с процессами: fork, execve (системный вызов), exec* (семейство функций), wait, waitpid, pipe, dup, dup2. Рассмотеть отличия вызова CreateProcess в WinAPI.
  3. Написать программу, создающую дочерний процесс. Родительский и дочерний процессы работают в бесконечном цикле и выводят что-то a) на ст. вывод б) в файл. С помощью ps l проследить "наследственную" связь между процессами.
  4. Убедиться, что родительский и дочерний процессы имеют общее адресное пространство, а также, что его копирование происходит только при записи (прочитать про vfork во FreeBSD и clone в Linux).
  5. Заместить образ дочернего процесса, используя одну из функций exec*. В родительском процессе сделать wait (а также waitpid с различными опциями).
  6. Добиться появления процесса-сироты (и наследования его процессом init) и процесса-зомби (проверять с помощью команд top и ps).
  7. Сделать, чтобы дочерний процесс читал входные данные из файла (писал выходные в файл).

↓Практическая работа 1.2

  1. Создать два дочерних процесса, которые общаются между собой через pipe.
  2. Запускать процессы в фоновом режиме, при запуске нового делать асинхронный waitpid и сообщать о завершившихся процессах.
  3. Найти в системе программы с установленным set-uid-bit-ом, пояснить, зачем он там нужен.
  4. Запустить дочерний процесс с установленными переменными окружения, проверить и поменять их значения с помощью системных вызовов getenv, setenv.