Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6262.pdf
Скачиваний:
34
Добавлен:
13.02.2021
Размер:
6.54 Mб
Скачать

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.

Студенту следует проверить содержимое всего отчета по данной работе, а также

обозначить основные подразделы в его содержании.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]