- •Кафедра программного обеспечения информационных технологий
- •«Операционные системы и системное программирование»
- •40 01 01
- •Содержание
- •Введение
- •Разработка программ в ос unix
- •1.1 Отличительные черты ос unix
- •1.2 Основы архитектуры операционной системы unix
- •1.3 Ядро системы
- •1.4 Пользователи системы, атрибуты пользователя
- •1.5 Системные вызовы и функции стандартных библиотек
- •1.6 Описание программы, переменные окружения
- •1.7 Аргументы и опции программы
- •1.8 Обработка ошибок
- •2 Файлы и файловая система
- •2.1 Файлы
- •2.2 Типы файлов
- •2.2.1 Обычные файлы
- •2.2.2 Каталоги
- •2.2.3 Файлы символичной связи (ссылки)
- •2.2.4 Файлы устройства
- •2.2.5 Именованные каналы
- •2.2.6 Сокеты
- •2.3 Владельцы файлов и права доступа к файлу
- •2.4 Дополнительные атрибуты файла
- •2.5 Файловый ввод/вывод
- •Открытие файла
- •2.6 Мультиплексированный ввод/вывод
- •2.7 Векторный ввод/вывод
- •2.8 Файлы, отображающиеся в памяти
- •2.9 Каталоги, работа с каталогами
- •2.9.1 Создание каталога
- •2.9.2 Удаление каталога
- •2.9.3 Чтение информации из каталога
- •2.9.4 Закрытие каталога
- •2.10 Создание жестких ссылок
- •2.11 Символическая ссылка
- •2.12 Удаление ссылки (или имени файла)
- •2.13 Переименование файла
- •2.14 Файловая система ос unix
- •2.14.1 Организация файловой системы ext2
- •2.15 Файлы устройств
- •3 Процессы
- •3.1 Виды процессов
- •3.2 Создание процесса
- •3.3 Вызовы семейства exec
- •3.4 Функции завершения процесса
- •3.5 Ошибки
- •3.6 Копирование при записи
- •3.7 Системные вызовы ожидания завершения процесса
- •3.8 Системный вызов system
- •3.9 Основные параметры, передаваемые процессу
- •3.10 Сеансы и группы процессов
- •4 Взаимодействие процессов
- •4.1 Сигналы
- •4.1.1 Отправка (генерация) сигнала
- •4.1.2 Наборы сигналов
- •4.1.3 Блокировка сигналов
- •4.2 Неименнованные каналы (трубы)
- •4.2.1 Размер канала и взоимодействие процессов при передаче данных
- •4.3 Именнованные каналы
- •4.4 Дополнительные средства межпроцессного взоимодействия
- •4.5 Механизмы межпроцессорного взаимодействия
- •4.5.1 Очереди сообщений
- •4.5.2 Семафоры Семафоры как теоретическая конструкция
- •4.5.3 Разделяемая память
- •4.5.4 Потоки
- •Int pthread_setschedparam(pthread_t tid, int policy, const struct sched_param *param);
- •Int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);
- •5 Операционные системы
- •5.1 Понятие операционной системы
- •5.2 Характеристики современных ос
- •5.2.1 Многопоточность
- •5.2.2 Распределенные ос
- •5.2.3 Концепция ос на основе микроядра
- •5.2.4 Функции микроядра.
- •5.3 Принципы построения ос
- •5.4 Концептуальные основы ос
- •5.4.1 Процессы
- •Модель работы процесса с двумя приостановочными состояниями
- •Варианты решения:
- •Решение задачи взаимного исключения. Алгоритм Деккера.
- •Решение задачи взаимного исключения. Алгоритм Пэтерсона..
- •Синхронизирующие примитивы (семафоры).
- •Задача “производитель-потребитель” Общие семафоры
- •Задача “производитель-потребитель”, буфер неограниченного размера(Спящий парикмахер)
- •Задача “производитель-потребитель”, буфер ограниченного размера
- •5.4.2 Распределение ресурсов. Проблема тупиков
- •Алгоритм банкира
- •Применение алгоритма банкира
- •5.4.3 Монитороподобные средства синхронизации
- •Механизм типа «критическая область»
- •5.4.4 Виртуализация
- •5.4.5 Подсистема управления памятью
- •5.4.6 Виртуальная оперативная память
- •5.5 Аппаратные особенности процессоров Intel-архитектуры, направленных на поддержку многозадачности
- •5.5.1 Сегментация памяти. Ia-32
- •5.5.2 Распределение памяти в реальном режиме
- •5.5.3 Организация защиты в процессоре
- •5.5.4 Поддержка многозадачности в процессорах архитектуры ia-32
2.9.3 Чтение информации из каталога
Для того чтобы начать читать содержимое каталога, нужно создать поток каталога (directory stream), представляемый объектом DIR:
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dir);
void rewinddir(DIR *dirptr);
Где структура dirent представлена так:
struct dirent
{ ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256]; }
Первый системный вызов используется для открытия потока каталога, в качестве параметров которого указывается название каталога, он возвращает указатель на поток каталога. При успешном выполнении возвращается указатель соответственного типа, при ошибке NULL.
Второй системный вызов позволяет читать записи из каталога. В качестве параметра вызова передается указатель на дескриптор открытого файла, а возвращается - указатель на запись.
В структуре dirent POXIS определяет только поле d_name, остальные поля могут модифицироваться, но в основном они такие:
поле идентификатора дескриптора
смещение к следующей записи
длина данной записи
тип файла
имя файла
При ошибке системный вызов возвращает NULL.
При каждом выполнении происходит смещение на следующую запись в каталоге (следующее имя файла). При каждом вызове errno нужно устанавливать в 0, а после завершения проверять значение. Пример ошибки, которая может возвратиться:
EBADF – задано недоступное значение аргумента
Это для отличия ситуации, когда доходит до последней записи, и ошибочной ситуации при чтении с каталога.
Третий системный вызов возвращает указатель чтения на первую запись в каталоге.
#include <sys/types.h>
#include <dirent.h>
struct dirent *d;
DIR *dp;
if ((dp=opendir(name))==NULL)
return(-1);
while (d=readdir(dp)) //
{ if (d->d_ino!=0) printf(“%s\n”,d->d_name);
}
rewinddir(dp); //
while (d=readdir(dp))
{ if (d->d_ino!=0) printf(“%s\n”,d->d_name);
}
close(dp);
return(0);
}
Эта программа выводит два раза содержимое каталога (имена файлов в этом каталоге, включая . и ..). Но нужна дополнительная проверка, чтобы число индексных дескрипторов было отлично от 0.
2.9.4 Закрытие каталога
Для закрытия каталога используется встроенный системный вызов:
int closedir(DIR *dir);
Успешный вызов closedir() закрывает поток каталога, переданный при помощи параметра dir, а также соответствующий дескриптор файла и возвращает значение 0. В случае ошибки функция возвращает -1 и присваивает переменной errno значение EBADF – единственный возможный код ошибки, указывающий, что dir не является открытым потоком каталога.
2.10 Создание жестких ссылок
Можно еще создавать жесткую ссылку или еще одно имя для существующего файла:
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
Для одного и того же файла можно создавать несколько имен:
link(“/home/gr1/stud1”, “/home/gr2/stud2”);

Успешный вызов link() создает для пути newpath новую ссылку, указывающую на существующий файл oldpath, и возвращает значение 0. После завершения оба пути, oldpath и newpath, указывают на один и тот же файл, то есть, фактически невозможно сказать, какая из ссылок была «исходной». При ошибке возвращается -1.
EACCESS –у вызывающего процесса отсутствуют разрешения на поиск для компонента пути oldpath или у вызывающего процесса нет разрешений на запись в каталог, содержащий newpath.
EEXIST – путь newpath уже существует — системный вызов link () не переопределяет существующие записи каталога.
EFAULT – параметр oldpath или newpath содержит недопустимый указатель.
EIO – произошла внутренняя ошибка ввода-вывода.
ELOOP – при разрешении пути oldpath или newpath встретилось слишком много символических ссылок.
EMLINK – на структуру inode, на которую указывает путь oldpath, уже указывает максимально допустимое количество ссылок.
ENAMETOOLONG –слишком длинное значение oldpath или newpath.
ENOENT – компонент oldpath или newpath не существует.
ENOMEM – недостаточно памяти для выполнения данного запроса.
ENOSPC – на устройстве, которому принадлежит newpath, недостаточно свободного пространства для новой записи каталога.
ENOTDIR – компонент oldpath или newpath не является каталогом.
EPERM – файловая система, которой принадлежит newpath, не допускает создание новых жестких ссылок или oldpath является каталогом.
EROFS – newpath принадлежит файловой системе, доступной только для чтения.
EXDEV – пути newpath и oldpath не принадлежат одной и той же подмонтированной системе. (Linux допускает монтирование одной файловой системы в нескольких точках, но даже в этом случае нельзя создавать жесткие ссылки между точками монтирования.)
