Читаем Linux API. Исчерпывающее руководство полностью

6. Если возвращаемое значение подпрограммы обслуживания системного вызова свидетельствует о возникновении ошибки, то функция-оболочка присваивает это значение глобальной переменной errno (см. раздел 3.4). Затем функция-оболочка возвращает управление вызывавшему ее коду, предоставляя ему целочисленное значение, указывающее на успех или неудачу системного вызова.

В Linux подпрограммы обслуживания системных вызовов следуют соглашению о том, что для указания успеха возвращается неотрицательное значение. При ошибке подпрограмма возвращает отрицательное число, являющееся значением одной из errno-констант с противоположным знаком. Когда возвращается отрицательное значение, функция-оболочка библиотеки C меняет его знак на противоположный (делая его положительным), копирует результат в errno и возвращает значение –1, чтобы указать вызывающей программе на возникновение ошибки.

Это соглашение основано на предположении, что подпрограммы обслуживания системных вызовов в случае успеха не возвращают отрицательных значений. Но для некоторых таких подпрограмм это предположение неверно. Обычно это не вызывает никаких проблем, поскольку диапазон превращенных в отрицательные числа значений errno не пересекается с допустимыми отрицательными возвращаемыми значениями. Тем не менее в одном случае все же появляется проблема — когда дело касается операции F_GETOWN системного вызова fcntl(), рассматриваемого в разделе 59.3.

На рис. 3.1 на примере системного вызова execve() показана описанная выше последовательность. В Linux/x86-32 execve() является системным вызовом под номером 11 (__NR_execve). Следовательно, 11-я запись в векторе sys_call_table содержит адрес sys_execve(), подпрограммы, обслуживающей этот системный вызов. (В Linux подпрограммы обслуживания системных вызовов обычно имеют имена в формате sys_xyz(), где xyz() является соответствующим системным вызовом.)

Рис. 3.1.Этапы выполнения системного вызова

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

В качестве примера издержек на осуществление системного вызова рассмотрим системный вызов getppid(). Он просто возвращает идентификатор родительского процесса, которому принадлежит вызывающий процесс. В одной из принадлежащих автору книги x86-32-систем с запущенной Linux 2.6.25 на совершение 10 миллионов вызовов getppid() ушло приблизительно 2,2 секунды. То есть на каждый вызов ушло около 0,3 микросекунды. Для сравнения, на той же системе на 10 миллионов вызовов функции языка C, которая просто возвращает целое число, ушло 0,11 секунды, или около 1/12 времени, затраченного на вызовы getppid(). Разумеется, большинство системных вызовов имеет более существенные издержки, чем getppid().

Поскольку с точки зрения программы на языке C вызов функции-оболочки библиотеки C является синонимом запуска соответствующей подпрограммы обслуживания системного вызова, далее в книге для обозначения действия «вызов функции-оболочки, которая запускает системный вызов xyz()» будет использоваться фраза «запуск системного вызова xyz()».

Дополнительные сведения о механизме системных вызовов Linux можно найти в изданиях [Love, 2010], [Bovet & Cesati, 2005] и [Maxwell, 1999].

3.2. Библиотечные функции

Библиотечная функция — одна из множества функций, составляющих стандартную библиотеку языка C. (Для краткости далее в книге при упоминании о конкретной функции вместо словосочетания «библиотечная функция» будем просто использовать слово «функция».) Эти функции предназначены для решения широкого круга разнообразных задач: открытия файлов, преобразования времени в формат, понятный человеку, сравнения двух символьных строк и т. д.

Многие библиотечные функции вообще не используют системные вызовы (например, функции для работы со сроками). С другой стороны, некоторые библиотечные функции являются надстройками над системными вызовами. Например, библиотечная функция fopen() использует для открытия файла системный вызов open(). Зачастую библиотечные функции разработаны для предоставления более удобного интерфейса вызова по сравнению с тем, что имеется у исходного системного вызова. Например, функция printf() предоставляет форматирование вывода и буферизацию данных, а системный вызов write() просто выводит блок байтов. Аналогично этому функции malloc() и free() выполняют различные вспомогательные задачи, существенно облегчающие выделение и высвобождение оперативной памяти по сравнению с использованием исходного системного вызова brk().

3.3. Стандартная библиотека языка C; GNU-библиотека C (glibc)
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных