Процессы. Системные вызовы.
Выполнение
Выполнение соответствует заданию. Посмотреть исходные файлы, докерфайл можно в исходных кодах. Из особенностей:
- Компилятор(основной) был использован
clang
, так как Makefile позволяет через флагCC=
задать любой другой компилятор с синтаксисом как уgcc
- Легковесный дистрибутив Alpine Linux не любит грамотно распараллеливать процесс через fork() на число потоков большее, чем число процессоров. По этой причине решено было использовать с этой лабораторной работы дистрибутив Debian в ветке
debian:jessie-slim
, отличающуюся от основной большей облегченностью. - Для экономии места пакеты через
apt-get
устанавливаются с флагом--no-install-recommends
- Для загрузки в репозиторий Docker была использована команда
docker tag
:docker tag linux:labka4 elgudjo/linux:labka4
Инструкции по сборке
Сборка
cd labka4
docker build -t linux:labka4 .
Запуск
docker run --rm linux:labka4
Готовый образ
docker pull elgudjo/linux:labka4
docker run --rm elgudjo/linux:labka4
Исходные файлы
Makefile
TARGET = labka4
PREFIX = /usr/local/bin
CC = clang
.PHONY: all clean install uninstall
all: $(TARGET)
clean:
rm -rf $(TARGET) *.o
labka4.o: lab4.c
$(CC) -c -o labka4.o labka4.c
pr_a.o: pr_a.c
$(CC) -c -o pr_a.o pr_a.c
pr_b.o: pr_b.c
$(CC) -c -o pr_b.o pr_b.c
$(TARGET): labka4.o pr_a.o pr_b.o
$(CC) -o $(TARGET) labka4.o pr_a.o pr_b.o
install:
install -D $(TARGET) $(PREFIX)/$(TARGET)
uninstall:
rm -rf $(PREFIX)/$(TARGET)
labka4.c
/* Пример создания нового
процесса с разной работой процессов
ребенка и родителя */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include "labka4.h"
int main()
{
pid_t pid, ppid;
int a = 0;
int b = 100;
int children = fork();
if(children == -1){
return 1;
}
pid = getpid();
ppid = getppid();
if(children == 0){
b = pr_b(b);
} else {
a = pr_a(a);
}
printf("My pid = %d, my ppid = %d,result a = %d,result b = %d\n",(int)pid,(int)ppid,a,b);
return 0;
}
labka4.h
///////////////////////////////////////
// labka4.h
#ifndef PR_A
//#define DO_A(X) pr_a(X);
#define PR_A
int pr_a();
#endif /*DO_A*/
#ifndef PR_B
//#define DO_B(X) pr_b(X);
#define PR_B
int pr_b();
#endif /*DO_B*/
pr_a.c
int pr_a( int x )
{
return x + 1;
}
pr_b.c
int pr_b( int x )
{
return x - 1 ;
}
Dockerfile
FROM debian:jessie-slim
#FROM alpine
WORKDIR /src
#RUN apk add --update clang binutils gcc clang-libs libc-dev coreutils
RUN apt-get update && apt-get install -y --no-install-recommends \
libc6-dev clang coreutils binutils gcc make \
&& rm -rf /var/lib/apt/lists/*
ADD ./src/* ./
RUN make all
RUN make install
#ENTRYPOINT "sh"
CMD labka4