ВУЗ:
Составители:
25
семблере, существуют библиотеки процедур, делающие возможным обращение
к системным процедурам из программ на Си других языках с тем же успехом.
Очень полезно всегда помнить следующее. Любой компьютер с одним
процессором в каждый конкретный момент времени может выполнить только
одну команду. Если процесс выполняет программу пользователя в пользова-
тельском режиме и нуждается в системной службе, например чтении данных
из файла, он должен выполнить прерывание или команду системного вызова
для передачи управления операционной системе. Затем операционная система
по параметрам вызова определяет, что требуется вызывающему процессу. По-
сле этого она обрабатывает системный вызов и возвращает управление коман-
де, следующей за системным вызовом. В известном смысле выполнение сис-
темного вызова похоже на осуществление вызова процедуры, только первый
проникает в ядро, а второй этого не делает.
Для того чтобы прояснить механизм системных вызовов, кратко рассмот-
рим системный вызов read. Как упоминалось выше, у него есть три параметра:
первый служит для задания файла, второй указывает на буфер, третий задает
количество байтов, которое нужно прочитать. Как практически все системные
вызовы, он запускается из программы на Си с помощью вызова библиотечной
процедуры с тем же именем, что и системный вызов: read. Вызов из программы
на Си может выглядеть так:
count = read(fd. buffer, nbytes):
Системный вызов (и библиотечная процедура) возвращает количество дей-
ствительно прочитанных байтов в переменной сcount. Обычно эта величина
совпадает с параметром nbytes, но может быть меньше, если, например, в про-
цессе чтения процедуре встретился конец файла.
Если системный вызов не может быть выполнен или из-за неправильных
параметров или из-за дисковой ошибки, значение счетчика count устанавлива-
ется равным 1, а номер ошибки помещается в глобальную переменную errno.
Программы всегда должны проверять результат системного вызова, чтобы от-
слеживать появление ошибки.
Системные вызовы выполняются за серию шагов. Вернемся к упоминав-
шемуся выше примеру вызова read для того, чтобы разъяснить этот момент.
Сначала при подготовке к вызову библиотечной процедуры read, которая фак-
тически осуществляет системный вызов read, вызывающая программа помеща-
ет параметры в стек, как показано в шагах 1-3 на рис. 12. Компиляторы С и С++
помещают параметры в стек в обратном порядке, так исторически сложилось
(чтобы первым был параметр для printf, то есть строка формата оказалась на
вершине стека). Первый и третий параметры передаются по значению, а второй
параметр передается по ссылке, то есть передается адрес буфера (на то, что это
ссылка, указывает символ &), а не его содержимое. Затем следует собственно
вызов библиотечной процедуры (шаг 4). Эта команда процессора представляет
Страницы
- « первая
- ‹ предыдущая
- …
- 23
- 24
- 25
- 26
- 27
- …
- следующая ›
- последняя »