
- •Введение
- •1 Тема 7. Подсистема управления вводом-выводом
- •1.1 Язык С как стандарт взаимодействия с ОС
- •1.2 Системные операции для работы с файловой системой
- •1.2.1 Системные вызовы open() и close()
- •1.2.2 Системные вызовы read() и write()
- •1.2.3 Системный вызов lseek()
- •1.3 Создание специальных файлов
- •1.4 Запрос информации о статусе файлов
- •1.5 Каналы
- •1.5.1 Полудуплексные каналы UNIX
- •1.5.2 Именованные каналы FIFO
- •1.6 Дублирование дескрипторов файлов
- •1.7 Монтирование и демонтирование ФС
- •1.8 Ссылки на имена файлов
- •1.9 Лабораторная работа по теме №7
- •1.9.1 Интегрированная среда разработки Eclipse
- •1.9.2 Список заданий выполняемых работ
- •1.9.3 Проблема типов в языке С
- •1.9.4 Анализ структуры MBR блочных устройств
- •1.9.5 Запрос информации о статусе файлов
- •1.9.6 Неименованные каналы ядра ОС
- •1.9.7 Именованные каналы FIFO
- •1.9.8 Монтирование flashUSB
- •1.9.9 Работа с именами файлов
- •2 Тема 8. Подсистема управления памятью
- •2.1 Классификация способов управления ОЗУ
- •2.2 Программный и аппаратный способы адресации памяти
- •2.3 Страничная и сегментная адресации памяти
- •2.4 Комбинированный способ адресации памяти
- •2.5 Лабораторная работа по теме №8
- •2.5.1 Структура поцесса
- •2.5.2 Определяемые сегменты процесса
- •2.5.3 Создание и удаление процессов из памяти
- •2.5.4 Динамическое выделение и освобождение памяти процесса
- •3 Тема 9. Базовое взаимодействие процессов
- •3.1 Подсистема управления процессами
- •3.2 Синхронизация процессов
- •3.3 Стандарты POSIX
- •3.4 Системные вызовы ОС по управлению процессами
- •3.5 Системный вызов fork() и каналы процесса
- •1.5.1 Пример использования каналов процессов
- •1.5.2 Имитация конвейеров языка shell
- •3.6 Нити (Threads)
- •3.7 Сигналы POSIX
- •3.8 Лабораторная работа по теме №9
- •3.8.1 Системные вызовы общей группы
- •3.8.2 Управление потоками процессов
- •3.8.3 Обработка сигналов ОС
- •4 Тема 10. Асинхронное взаиодействие процессов
- •4.1 Проблемы распределения ресурсов ОС
- •4.2 Системный пакет IPC
- •4.3 Утилиты управления средствами пакета IPC
- •Утилита ipcmk
- •Утилита ipcs
- •Утлита ipcrm
- •4.4 Семафоры
- •4.5 Задача об обедающих философах
- •4.5.1 Описание задачи
- •4.5.2 Выбор стратегии решения
- •4.5.3 Модель философа
- •4.5.4 Программа-монитор
- •4.6 Лабораторная работа по теме №10
- •4.6.1 Синхронизация двух процессов
- •4.6.2 Задача «Обедающие философы»
- •5 Тема 11. Эффективное взаиодействие процессов
- •5.1 Прикладные средства пакета IPC
- •5.2 Разделяемые сегменты памяти
- •5.3 Задача о читателях и писателях
- •5.4 Передача сообщений
- •5.5 Лабораторная работа по теме №11
- •5.5.1 Задачи с разделяемыми сегментами памяти
- •5.5.2 Программы передачи сообщений
- •6 Тема 12. Системная шина D-Bus
- •6.1 Графические среды ОС
- •6.2 Рабочий стол пользователя
- •6.3 Различия графических сред ОС
- •6.4 X-сервер UNIX
- •6.5 Архитектура шины D-Bus
- •6.5.2 Бибиотека libdbus
- •6.5.3 Проекции ПО D-Bus на языки программирования
- •6.6 Лабораторная работа по теме №12
- •6.6.1 Утилита qdbus
- •6.6.2 Взаимодействие через шину с приложением evince
- •Заключение
- •Список использованных источников
65
ет разобраться в алгоритме программы, представленной листингом 1.2, которая демострирует чтение первого сектора заданного блочного устройства и проверку возможного наличия в нем сигнатуры MBR.
Запустив среду разработки Eclipse, следует создать проект lab7.2, в котором реализовать этот алгоритм.
Проведя необходимое исследование, следует оформить отчет о проделанной работе.
Следующий пример, представленный листингом 1.4, расширяет возмозможности предыдущего алгоритма. Здесь используется структура отдельной записи таблицы Partition Table, представленная на листинге 1.3, которая обрабатывается в цикле программой и выводится ей на терминал.
Реализация этой программы выполняются в проекте lab7.3.
Результаты исследования работы этой программы следует сравнить с работой утилиты fdisk и полученные результаты отразить в отчете.
Последний пример, приведенный на листинге 1.5, показывает другой вариант реализации алгоритма. Здесь используется системный вызов lseek(...), который позволяет произвольно перемещаться по сектору блочного устройства, содержащего MBR, и читать нужные данные не привлекая синтаксических конструкций языка С типа структур.
Реализация этой программы выполняется в проекте lab7.4.
Результаты исследования работы этой программы следует сравнить с работой утилиты fdisk и полученные результаты отразить в отчете.
1.9.5 Запрос информации о статусе файлов
Понятие файла обычно ассоциируется с хранилищем данных, у которого имеется имя и местоположение в файловой системе ОС. Это расхожее представление необходимо изменить, изучив подраздел 1.3, обясняющий:
•основные типы файлов ОС;
•понятие i-узла (inode) файла, как основного его идентификатора.
На основе этой информации можно изучать подраздел 1.4, описывающий системные вызовы ОС по получению данных о статусе файлов.
Исходный текст программы, которая выполняет один из таких запросов, приведен на листнге 1.6.
Реализаци программы выполняется в проекте lab7.5.
Студенту следует, используя этот проект, провести:
•исследование статуса различных файлов;
•сравнение результатов работы этой программы с результатами работы утилиты stat.

66
1.9.6 Неименованные каналы ядра ОС
Неименованные каналы ядра ОС, исторически имеющие название «Полудуплексные каналы UNIX», предназначенны для однонаправленного взаимодействия «родственно связанных» процессов, порождаемых системным вызовом fork(...).
Ядро ОС создает такой канал посредством системного вызова pipe(...), предоставляя процессам два номера дескриптора канала: один на чтение; другой на запись. Изучив теорию подраздела 1.5 (1.5.1), студенту следует выполнить два примера работы с каналами.
Первый пример, представленный листингом 1.7, не имеет прикладной практической ценности. Он демонстрирует только основную идею использования неименованных каналов с помощью системного вызова pipe(...). Соответственно, проект lab7.6 обеспечивает запуск этого примера.
Второй пример, представленный листингом 1.8, собственно и демонстрирует простейший вариант взаимодействия двух процессов посредством одного канала, направленного от родительского процесса к дочернему. Соответственно, проект lab7.7 обеспечивает запуск этого примера.
Замечание
Программные результаты проектов lab7.6 и lab7.7 следует запускать и исследовать в окне терминала, поскольку консоль Eclipse плохо поддерживает системный ввод-вывод.
1.9.7 Именованные каналы FIFO
Именованные каналы FIFO призваны устранить недостатки, присущие каналам pipe(...). Для этого используются специальные файлы типа FIFO.
Теоретические основы создания и использования этих каналов изложены в подразделе 1.5 (1.5.2) данного пособия.
Листинг 1.9 демострирует пример создания канала с именем /home/upk/cfifo и взаимодействие двух родственных процессов через этот канал.
Этот пример реализуется в виде проекта lab7.8. Обратите внимание, что после запуска приложения проекта создается файл, который:
•сохраняется после перезапуска компьютера (при условии, что студент сохранил изменения в личном архиве);
•обеспечивает взаимодействие любых процессов, необязательно родственных.
Студенту следует исследовать работу с этим каналом, например:
•с помощью команды echo, в командной строке терминала, направить в канал сообщение;
•в другом терминале, с помощью команды cat, прочитать это сообщение.

67
1.9.8 Монтирование flashUSB
Проблематика монтирования блочных устройств описана в подразделе 1.6 данного пособия. В целом, она порождается:
•наличием большого количества типов файловых систем различных ОС;
•необходимости привязки всего многообразия архитектур ФС к единой архитектуре VFS ядра ОС.
Вкачестве задачи, демострирующей простейшие возможности системного вызова mount(...), используется пример монтирования личного flashUSB студента к директории mnt, созданной в домашней директории пользователя upk.
Простейшая программа, реализующая эту задачу, представлена на листинге 1.10,
предполагая, что имя устройства flashUSB равно /dev/sdc1.
Листинг 1.10 — Программа монтирования личного flashUSB
#include <stdio.h> #include <stdlib.h> #include <sys/mount.h>
int main(void) {
//Результат запуска int res = 0;
res = mount ("/dev/sdc1", "/home/upk/mnt", "vfat", 0, "uid=1000,gid=1000,utf8=1");
if (res < 0) { perror("sdc1"); return 1;
}else{
puts("\nУспешное монтирование /dev/sdc1 на ~mnt\n"); return EXIT_SUCCESS;
}
}
Исследование данного примера можно провести на основе проекта lab7.9, реализованного в среде Eclipse. Для этого, студенту следует:
•подключить к ЭВМ личную flashUSB и определить используемое для нее имя устройства;
•провести изменения в программе, указав реальное имя устройства;
•провести компиляцию проекта;
•запустить программу в терминале командой sudo ./lab7.9;
•исследовать содержимое директории /home/upk/mnt и зафиксировать проделанную работу в отчете.
Замечание
Данный пример ориентирован на применение в среде ОС УПК АСУ или аналогичной ей ОС Linux.

68
1.9.9 Работа с именами файлов
Теоретические основы работы с именами файлов изложены в подразделе 1.8 данного руководства.
На листинге 1.11 приведен исходный текст программы, которая, в рабочей директории пользователя upk создает обычный файл, затем делает на него «жесткую» и символьную ссылки. Результат этих действий выводится на терминал.
Листинг 1.11 — Программа создания ссылок на файл
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h> #include <errno.h> #include <unistd.h>
int main(void) {
char f1[] = "/home/upk/test_file"; char f2[] = "/home/upk/link_file"; char f3[] = "/home/upk/symlink_file"; int fd;
printf("Создаем файл: %s\n", f1); unlink(f1);
fd = open(f1, O_RDWR | O_CREAT); if (fd < 0) {
perror(f1); exit(EXIT_FAILURE);
}
close(fd);
printf("Создаем жесткую ссылку: %s\n", f2); unlink(f2);
fd = link(f1, f2); if (fd < 0) {
perror(f2); exit(EXIT_FAILURE);
}
printf("Создаем Символьную ссылку: %s\n", f3); unlink(f3);
fd = symlink(f1, f3); if (fd < 0) {
perror(f3); exit(EXIT_FAILURE);
}
puts("Выводим результат на терминал:");
system("ls -il /home/upk/test_file /home/upk/link_file /home/upk/symlink_file"); puts("Конец программы...");
return EXIT_SUCCESS;
}
Реализация этой программы проводится в проекте lab7.10. Студенту следует:

69
•изучить теоретический материал, изложенный в подразделе 1.8;
•изучить исходный текст программы листинга 1.11;
•исследовать работу программы, на основе проекта lab7.10;
•сравнить работу данной программы с работой утилиты ln;
•отразить результаты исследования в личном отчете.
Замечание
Следует обратить внимание, что i-узлы файлов test_file и link_file — совпадают.
Данное задание является последним в лабораторной работе №7.
Студенту следует проверить содержимое всего отчета по данной работе, а также
обозначить основные подразделы в его содержании.