.. lab4 documentation master file, created by sphinx-quickstart on Wed May 23 22:09:07 2018. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Работа №4. Системные вызовы, процессы, компиляция программ ========================================================== Цели ^^^^ 1) Приобретение навыков по управлению процессами. 2) Изучение системного вызова fork(). 3) Приобретение навыков написания и трансляции системного ПО на языке C. 4) Изучение утилиты make и её использование для трансляции программ на языке C. 5) Использование удалённых серверов для трансляции приложений. 6) Изучение Docker и базового взаимодействия с ним. 7) Изучение способов нестандартного представления информации. Работа ^^^^^^ Начало работы было положено выбором основной платформы для Docker, коей стала -- Alpine, будучи выбранной из предложенных преподавателем: RancherOS, Ubuntu и Alpine. Главным критерием данного выбора оказался компактный размер этой системы, а также интерес к неизведанному. :: docker run -it alpine:latest .. Работа происходила на особой версии хоста kali для vbox, где был только root-пользователь. Далее производится начальная настройка системы. Обновление:: 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() с числом вместо использования временной переменной, которой присвоено значение этого вызова. Эту ошибку можно и нужно исправить следующим образом: .. figure:: https://github.com/everricvlvm/lab4/blob/master/source/_static/2.PNG?raw=true :scale: 100 % :align: center Теперь верно. Для синхронизации работы двух процессов, было решено в родительском процессе использовать команду sleep(): .. figure:: https://github.com/everricvlvm/lab4/blob/master/source/_static/3.PNG?raw=true :scale: 100 % :align: center Теперь родительский процесс дожидается запуска дочернего. Итак, осталось лишь собрать ее из нашего Makefile. Выполняем команды :: make && make install && make clean И запускаем программу из папки bin: .. figure:: https://github.com/everricvlvm/lab4/blob/master/source/_static/4.PNG?raw=true :scale: 100 % :align: center Вывод программы. Сохраняем образ -- для этого переходим в другой терминал и сначала ищем рабочий контейнер:: docker ps В колонке ContainerID уникальное имя контейнера, вводим его в команде :: docker commit *имя контейнера* *имя целевого каталога* У меня данная команда выглядит так: .. figure:: https://github.com/everricvlvm/lab4/blob/master/source/_static/5.PNG?raw=true :scale: 100 % :align: center Сохранение Docker-контейнера. Получить и проверить итоговый контейнер можно по команде:: docker run -it everricvlvm/lb4 Выводы ^^^^^^ Были исследованы процессы, системный вызов fork(), работа с Docker. Изучено взаимодействие удалённых сервисов меж собой, и как итог произведён данный отчёт на основе сетевых методик. .. toctree:: :maxdepth: 2 :caption: Contents: