Работа №4. Системные вызовы, процессы, компиляция программ

Цели

  1. Приобретение навыков по управлению процессами.
  2. Изучение системного вызова fork().
  3. Приобретение навыков написания и трансляции системного ПО на языке C.
  4. Изучение утилиты make и её использование для трансляции программ на языке C.
  5. Использование удалённых серверов для трансляции приложений.
  6. Изучение Docker и базового взаимодействия с ним.
  7. Изучение способов нестандартного представления информации.

Работа

Начало работы было положено выбором основной платформы для Docker, коей стала – Alpine, будучи выбранной из предложенных преподавателем: RancherOS, Ubuntu и Alpine. Главным критерием данного выбора оказался компактный размер этой системы, а также интерес к неизведанному.

docker run -it alpine:latest

Далее производится начальная настройка системы. Обновление:

apk update && apk upgrade

Установка рабочих программ:

apk add nano make gcc build-base openssh

Создание каталога work и скачивание в него рабочих файлов:

mkdir work
scp -r -P 6666 student@openit.guap.ru:/container/ABC-Linux/lab4/* work/
cd work

Теперь, после изучения полученных файлов, стало понятно, что Makefile имеет частую ошибку для системы make, а именно – пробелы вместо табуляции перед командами.

Оснавная же логическая ошибка содержится в lab4.c.

Она представляет собой сравнение результата функции с побочным эффектом fork() с числом вместо использования временной переменной, которой присвоено значение этого вызова. Эту ошибку можно и нужно исправить следующим образом:

https://github.com/everricvlvm/lab4/blob/master/source/_static/2.PNG?raw=true

Теперь верно.

Для синхронизации работы двух процессов, было решено в родительском процессе использовать команду sleep():

https://github.com/everricvlvm/lab4/blob/master/source/_static/3.PNG?raw=true

Теперь родительский процесс дожидается запуска дочернего.

Итак, осталось лишь собрать ее из нашего Makefile.

Выполняем команды

make && make install && make clean

И запускаем программу из папки bin:

https://github.com/everricvlvm/lab4/blob/master/source/_static/4.PNG?raw=true

Вывод программы.

Сохраняем образ – для этого переходим в другой терминал и сначала ищем рабочий контейнер:

docker ps

В колонке ContainerID уникальное имя контейнера, вводим его в команде

docker commit *имя контейнера* *имя целевого каталога*

У меня данная команда выглядит так:

https://github.com/everricvlvm/lab4/blob/master/source/_static/5.PNG?raw=true

Сохранение Docker-контейнера.

Получить и проверить итоговый контейнер можно по команде:

docker run -it everricvlvm/lb4

Выводы

Были исследованы процессы, системный вызов fork(), работа с Docker. Изучено взаимодействие удалённых сервисов меж собой, и как итог произведён данный отчёт на основе сетевых методик.