- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ЭКОНОМИКИ И УПРАВЛЕНИЯ – «НИНХ»
КАФЕДРА ПРИКЛАДНЫХ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
А.Л. ОСИПОВ
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
Учебное пособие
НОВОСИБИРСК
2011
УДК
ББК
Осипов А.Л. Системное программирование: учебное пособие. — Новосибирск: НГУЭУ, 2011. – 93 С.
Данное учебное пособие подготовлено в соответствии с Государственным образовательным стандартом высшего профессионального образования по направлению 230201.65 «Информационные системы и технологии».
Основная цель курса – формирование у студентов теоретических знаний в области системного программирования в Linux, практической применимости существующих в мире подходов и решений, направленных на повышение эффективности функционирования современных информационных систем и технологий.
Пособие ориентировано на студентов информационного профиля, однако может быть полезным для преподавателей высшей школы и курсов повышения квалификации, аспирантов и студентов управленческих специальностей.
ББК
© Осипов А.Л., 2011
© НГУЭУ, 2011
Введение
Учебное пособие посвящено системным вызовам Linux – интерфейсу между ядром Linux и использующими его возможности пользовательскими программами. Системные вызовы обеспечивают единственный способ доступа к механизмам ядра, таким как файловая система, средства реализации многозадачности и примитивы межпроцессного взаимодействия.
Системные вызовы определяют саму суть Linux. Все остальное – функции и команды – создано на их основе. Программирование для UNIX за последние два десятилетия разделилось на множество направлений, а Open Group – главный комитет по стандартизации – охватил почти все, что можно, в результате чего этот интерфейс стал громоздким, избыточным и подверженным ошибкам. Однако он все еще эффективен, надежен и портируем, и именно поэтому UNIX системы пользуются таким успехом.
В учебном пособии рассказывается, как использовать системные вызовы, каких вызовов следует избегать в силу того, что они являются ненужными, устаревшими, некорректными или просто неудачно реализованными.
Учебное пособие включает множество примеров, реализуемых на языке программирования, С. Каждая глава заканчивается упражнениями.
В этой связи изучение данного курса является важнейшей составляющей подготовки высококвалифицированных специалистов, владеющих знаниями системного программирования, интеграции информатизации в производственные и управленческие процессы.
Цель учебного пособия – помочь формированию у студентов навыков работы с технологиями системного программирования. В нем изложены основные теоретические и практические вопросы, связанные с построением и использованием системного программирования для решения различных проблем. Автор видит основную задачу в знакомстве читателей определенного круга, прежде всего студентов, с программированием как инструментом решения задач, встречающихся в их профессиональной деятельности. В данном пособии изложены концепции и основные идеи, на которых базируется системное программирование и даны практические примеры их применения. Оно не является всеобъемлящим, а содержит лишь самые необходимые сведения о них и призвано закрепить и систематизировать знания в соответствии с программой соответствующего учебного курса.
Учебное пособие содержит контрольные задания по всем темам, которые представляют специфическую форму самообразования. В конце каждой лекции следует перечень необходимой литературы, используемый при подготовке данной темы. В учебном пособии представлен глоссарий основных понятий, использованных в курсе, обращение к которому будет способствовать лучшему пониманию материала. В целом учебное пособие построено таким образом, чтобы дать читателям всестороннее представление о современных особенностях технологий системного программирования.
Глава 1. Фундаментальные концепции unix Систем
Файлы
Имеется несколько типов файлов UNIX: обычные файлы, каталоги, символические связи, специальные файлы, именованные каналы и сокеты.
Обычные файлы. Обычный файл содержит байты данных, организованные в одномерный массив. Любой байт и любую последовательность байтов можно прочитать и записать. Чтение и запись начинается с байта, определяемого смещением в файле, которому можно присвоить любое значение. Обычные файлы хранятся на диске.
Несколько процессов могут читать и записывать один и тот же файл одновременно. Получаемые при этом результаты зависят от очередности отдельных запросов ввода-вывода. Для поддержания порядка используются механизмы блокировки файлов и семафоры – общесистемные флаги, которые процессы могут проверять и устанавливать.
Файлы не имеют имен – они имеют номера, называемые индексами. Индекс относится к массиву индексных узлов (i-nodes), хранимому перед каждой областью диска с файловой системой UNIX. Каждый индексный узел содержит важную информацию об одном файле. Она включает следующее: тип файла, число связей, пользовательский и групповой идентификаторы владельца, три набора значений, определяющих права доступа к файлу для владельца, группы и других пользователей, размер файла в байтах, время последнего обращения к файлу, время последнего изменения файла, указатели на блоки диска, в которых хранится содержимое файла.
Каталоги и символические связи. Обращаться к файлам по индексным дескрипторам неудобно, поэтому система Unix поддерживает каталоги, позволяющие использовать вместо этого имена. С концептуальной точки зрения каждый каталог является таблицей, включающий два столбца: в одном столбце хранятся имена, а во втором – соответствующие им индексы. Пара «имя/ссылка» называется связью. Когда ядру Unix приказывают обратиться к файлу по имени, оно автоматически ищет в каталоге нужный индекс. Затем оно обращается к соответствующему индексному узлу, содержащему более подробную информацию о файле. Если ядру нужны сами данные, оно изучает индексный узел и узнает, где именно на диске они находятся.
Каталог очень похож на обычный файл: он имеет индексный узел и содержит данные. Таким образом, индексный узел, соответствующий конкретному имени в каталоге, может быть индексным узлом другого каталога. Благодаря этому пользователи Unix могут организовывать файлы в иерархическую структуру. Если вводится путь такой как, memo/alo/pin, то ядро получает индексный узел текущего каталога для нахождения его данных, находит в этих данных имя memo, получает соответствующий ему индекс, обращается к его индексному узлу с целью получения данных каталога memo, находит среди них alo, получает соответствующий индекс, обращается к его индексному узлу с целью получения данных каталога alo, находит имя pin и, наконец, добирается до ассоциированного с ним индексного узла. Ядро постоянно следит за индексом текущего каталога каждого процесса. Когда процесс изменяет свой текущий каталог, он должен указать путь к новому каталогу. Этот путь позволяет определить индекс, который и становится новым индексом текущего каталога. Для работы с каталогами предусмотрены специальные системные вызовы.
Множественные ссылки на файл с использованием индексов работают только в том случае, если связи относятся к той же файловой системе, так как индексы уникальны только в пределах файловой системы. Этот недостаток устраняют символические связи – в этом случае путь к целевому файлу помещается в раздел данных действительного файла. Это более сложный подход, чем создание второй связи в каком-то каталоге, но в то же время и более универсальный. Для работы с файлами символических ссылок служат специальные системные вызовы.
Специальные файлы. Специальным файлом обычно является некоторое устройство. Специальные файлы устройств делятся на две основных категории: блочные и символьные. Блочные специальные файлы соответствуют конкретной модели: устройство содержит массив блоков фиксированного размера (например, 4096 байтов), а для ускорения ввода-вывода используется пул буферов ядра, играющий роль кэша. Символьные специальные файлы не определяются вообще никакими правилами. Они позволяют выполнять ввод-вывод как совсем маленькими блоками (символами), так и очень большими (дорожками диска). Эти файлы слишком разнородны, чтобы использовать буферный пул.
Специальный файл имеет индексный узел, но он не указывает, ни на какие данные на диске. Вместо этого индексный узел содержит номер устройства – индекс в таблице, которую ядро использует для нахождения набора функций, называемого драйвером устройства. Добавить в ядро новые драйверы устройств относительно легко, благодаря чему можно сделать много интересного, не ограничиваясь простым взаимодействием с новыми типами устройств ввода-вывода. Это самый популярный способ заставить Unix выполнять что-то, о чем ее разработчики никогда не помышляли.