Лабораторная работа 5

Часть 1

Сервер при запуске должен сохранить: и раз в секунду обновлять: Сервер должен быть одним процессом с одним потоком.

Клиент должен один раз выводить текущую информацию от сервера.

Для получения необходимой информации будут полезны man страницы:
getpid(2), getuid(2), getgid(2), time(2), getloadavg(3C).

Подзадания:

  1. System V shared memory
  2. Для хранения требуемой информации и обмена информацией между клиентом и сервером используется разделяемый сегмент памяти. man shmget(2), shmat(2), shmdt(2).

  3. System V message queue
  4. Клиент обменивается с сервером используя System V message queue. man msgget(2), msgsnd(2), msgrcv(2).

  5. Отображение файла в память
  6. Для хранения требуемой информации и обмена информацией между клиентом и сервером используется файл, отображённый в память с использованием mmap(2).

Часть 2

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

Подзадания:

  1. Основной поток раз в секунду поочерёдно пробуждает один из потоков и дожидается конца его работы, после чего выводит полученный массив на стандартный вывод. Для реализации синхронизации необходимо использовать sem_init(3RT), sem_post(3RT), sem_wait(3RT).
  2. Основной поток раз в секунду поочерёдно пробуждает один из потоков и дожидается конца его работы, после чего выводит полученный массив на стандартный вывод. Для реализации синхронизации необходимо использовать semget(2), semop(2), semctl(2).
  3. Основной поток раз в указанное количество микросекунд выводит массив на стандартный вывод. Подпотоки раз в указанное количество микросекунд выполняют своё действие, блокируя на время своей работы доступ к общему ресурсу. Для блокировки использовать pthread_mutex_init(3C), pthread_mutex_lock(3C), pthread_mutex_unlock(3C).
  4. Основной поток раз в указанное количество микросекунд выводит массив на стандартный вывод. Подпотоки раз в указанное количество микросекунд выполняют своё действие. Еще один подпоток должен раз в указанное количество микросекунд выводить количество заглавных символов в массиве на стандартный вывод. Потоки, не изменяющие массив могут выполняться параллельно, но должны блокировать изменение на время работы. Для блокировки использовать pthread_rwlock_init(3C), pthread_rwlock_rdlock(3C), pthread_rwlock_wrlock(3C), pthread_rwlock_unlock(3C).

Часть 3

Подзадания:

  1. Unix domain socket
  2. Клиент обменивается с сервером используя unix domain socket (AF_UNIX). man socket(3SOCKET), bind(3SOCKET), listen(3SOCKET), accept(3SOCKET), connect(3SOCKET), select(3C).

    Сервер должен соответствовать требованиям первой части.

  3. Обработка сигналов
  4. При получении сигналов HUP, INT, TERM, USR1, USR2 сервер в стандартный поток вывода выводит соответствующий пункт накопленной информации. man signal(3C), sigaction(2), kill(1).

    Сервер должен соответствовать требованиям первой части.

  5. Неименованные каналы
  6. Процесс запускает дочерний подпроцесс, которому подменяется стандартный ввод. В подпроцессе запускается системная утилита wc. Основной процесс читает указанный через аргументы файл и передаёт в подпроцесс каждый чётный символ. man fork(2), execl(2), pipe(2), dup2(3C). При использовании system(3C) или popen(3C) задание принято не будет.

Требования

Каждый вариант должен быть реализован в виде отдельных испольняемых файлов.

Все файлы (исходный код, Makefile, исполнямые и объектные файлы, ...) должны быть в одном каталоге, для компиляции файлов должен быть написан Makefile, позволяющий перекомпилировать только изменённые файлы.

Баллы

Для получения возможности защиты на 3 балла необходимо выполнить по одному выданному заданию из каждой части.

Для получения возможности защиты на 4 балла необходимо выполнить по два задания из каждой части.

Для получения возможности защиты на 5 баллов необходимо выполнить все задания.