Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать

94

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ЭКОНОМИКИ И УПРАВЛЕНИЯ – «НИНХ»

КАФЕДРА ПРИКЛАДНЫХ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

А.Л. ОСИПОВ

СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ

Учебное пособие

НОВОСИБИРСК

2011

УДК

ББК

Осипов А.Л. Системное программирование: учебное пособие. — Новосибирск: НГУЭУ, 2011.  – 93 С.

Данное учебное пособие подготовлено в соответствии с Государственным образовательным стандартом высшего профессионального образования по направлению 230201.65 «Информационные системы и технологии».

Основная цель курса – формирование у студентов теоретических знаний в области системного программирования в Linux, практической применимости существующих в мире подходов и решений, направленных на повышение эффективности функционирования современных информационных систем и технологий.

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

ББК

© Осипов А.Л., 2011

© НГУЭУ, 2011

Введение

Учебное пособие посвящено системным вызовам Linux – интерфейсу между ядром Linux и использующими его возможности пользовательскими программами. Системные вызовы обеспечивают единственный способ доступа к механизмам ядра, таким как файловая система, средства реализации многозадачности и примитивы межпроцессного взаимодействия.

Системные вызовы определяют саму суть Linux. Все остальное – функции и команды – создано на их основе. Программирование для UNIX за последние два десятилетия разделилось на множество направлений, а Open Group – главный комитет по стандартизации – охватил почти все, что можно, в результате чего этот интерфейс стал громоздким, избыточным и подверженным ошибкам. Однако он все еще эффективен, надежен и портируем, и именно поэтому UNIX системы пользуются таким успехом.

В учебном пособии рассказывается, как использовать системные вызовы, каких вызовов следует избегать в силу того, что они являются ненужными, устаревшими, некорректными или просто неудачно реализованными.

Учебное пособие включает множество примеров, реализуемых на языке программирования, С. Каждая глава заканчивается упражнениями.

В этой связи изучение данного курса является важнейшей составляющей подготовки высококвалифицированных специалистов, владеющих знаниями системного программирования, интеграции информатизации в производственные и управленческие процессы.

Цель учебного пособия – помочь формированию у студентов навыков работы с технологиями системного программирования. В нем изложены основные теоретические и практические вопросы, связанные с построением и использованием системного программирования для решения различных проблем. Автор видит основную задачу в знакомстве читателей определенного круга, прежде всего студентов, с программированием как инструментом решения задач, встречающихся в их профессиональной деятельности. В данном пособии изложены концепции и основные идеи, на которых базируется системное программирование и даны практические примеры их применения. Оно не является всеобъемлящим, а содержит лишь самые необходимые сведения о них и призвано закрепить и систематизировать знания в соответствии с программой соответствующего учебного курса.

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

Глава 1. Фундаментальные концепции unix Систем

    1. Файлы

Имеется несколько типов файлов UNIX: обычные файлы, каталоги, символические связи, специальные файлы, именованные каналы и сокеты.

Обычные файлы. Обычный файл содержит байты данных, организованные в одномерный массив. Любой байт и любую последовательность байтов можно прочитать и записать. Чтение и запись начинается с байта, определяемого смещением в файле, которому можно присвоить любое значение. Обычные файлы хранятся на диске.

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

Файлы не имеют имен – они имеют номера, называемые индексами. Индекс относится к массиву индексных узлов (i-nodes), хранимому перед каждой областью диска с файловой системой UNIX. Каждый индексный узел содержит важную информацию об одном файле. Она включает следующее: тип файла, число связей, пользовательский и групповой идентификаторы владельца, три набора значений, определяющих права доступа к файлу для владельца, группы и других пользователей, размер файла в байтах, время последнего обращения к файлу, время последнего изменения файла, указатели на блоки диска, в которых хранится содержимое файла.

Каталоги и символические связи. Обращаться к файлам по индексным дескрипторам неудобно, поэтому система Unix поддерживает каталоги, позволяющие использовать вместо этого имена. С концептуальной точки зрения каждый каталог является таблицей, включающий два столбца: в одном столбце хранятся имена, а во втором – соответствующие им индексы. Пара «имя/ссылка» называется связью. Когда ядру Unix приказывают обратиться к файлу по имени, оно автоматически ищет в каталоге нужный индекс. Затем оно обращается к соответствующему индексному узлу, содержащему более подробную информацию о файле. Если ядру нужны сами данные, оно изучает индексный узел и узнает, где именно на диске они находятся.

Каталог очень похож на обычный файл: он имеет индексный узел и содержит данные. Таким образом, индексный узел, соответствующий конкретному имени в каталоге, может быть индексным узлом другого каталога. Благодаря этому пользователи Unix могут организовывать файлы в иерархическую структуру. Если вводится путь такой как, memo/alo/pin, то ядро получает индексный узел текущего каталога для нахождения его данных, находит в этих данных имя memo, получает соответствующий ему индекс, обращается к его индексному узлу с целью получения данных каталога memo, находит среди них alo, получает соответствующий индекс, обращается к его индексному узлу с целью получения данных каталога alo, находит имя pin и, наконец, добирается до ассоциированного с ним индексного узла. Ядро постоянно следит за индексом текущего каталога каждого процесса. Когда процесс изменяет свой текущий каталог, он должен указать путь к новому каталогу. Этот путь позволяет определить индекс, который и становится новым индексом текущего каталога. Для работы с каталогами предусмотрены специальные системные вызовы.

Множественные ссылки на файл с использованием индексов работают только в том случае, если связи относятся к той же файловой системе, так как индексы уникальны только в пределах файловой системы. Этот недостаток устраняют символические связи – в этом случае путь к целевому файлу помещается в раздел данных действительного файла. Это более сложный подход, чем создание второй связи в каком-то каталоге, но в то же время и более универсальный. Для работы с файлами символических ссылок служат специальные системные вызовы.

Специальные файлы. Специальным файлом обычно является некоторое устройство. Специальные файлы устройств делятся на две основных категории: блочные и символьные. Блочные специальные файлы соответствуют конкретной модели: устройство содержит массив блоков фиксированного размера (например, 4096 байтов), а для ускорения ввода-вывода используется пул буферов ядра, играющий роль кэша. Символьные специальные файлы не определяются вообще никакими правилами. Они позволяют выполнять ввод-вывод как совсем маленькими блоками (символами), так и очень большими (дорожками диска). Эти файлы слишком разнородны, чтобы использовать буферный пул.

Специальный файл имеет индексный узел, но он не указывает, ни на какие данные на диске. Вместо этого индексный узел содержит номер устройства – индекс в таблице, которую ядро использует для нахождения набора функций, называемого драйвером устройства. Добавить в ядро новые драйверы устройств относительно легко, благодаря чему можно сделать много интересного, не ограничиваясь простым взаимодействием с новыми типами устройств ввода-вывода. Это самый популярный способ заставить Unix выполнять что-то, о чем ее разработчики никогда не помышляли.