Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
122
Добавлен:
20.06.2014
Размер:
6.61 Mб
Скачать

21. Системные вызовы и функции стандартных библиотек. Обработка ошибок.

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

FreeBSD4.4 предполагает порядка 160 системных вызовов. В Unix используется набор, при котором каждый системный вызов имеет соответствующую функцию с тем же именем, хранящуюся в стандартной библиотеке С. Функция библиотеки выполняет необходимое преобразование аргументов, а потом вызывает процедуру ядра. Получается, библиотечный код выполняет роль оболочки. Кроме системных вызовов программисту предоставляются библиотечные функции общего назначения, они не являются точками входа в ядро ОС. Хотя некоторые из них в процессе выполнения выполняют системные вызовы.

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

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

Если говорить о подпрограммах Standard i/o Library, то они обеспечивают средство преобразования форматов данных и автоматическую буферизацию, что отсутствует в системных вызовах доступа к файлам.

Обработка ошибок. Обычно в случае возникновения ошибки системные вызовы возвращают -1 и устанавливают значение переменной errno. Это значение указывает причину возникновения ошибки. Заголовочный файл <errno.h> содержит коды ошибок. Значение этих кодов принимает errno. Библиотечные функции в отличии от системных вызовов имеют различный код возврата и не формируют errno.

errno объявлена как экспортируемая внешняя переменная external int errno;

В С объявлена функция:

#include <errno.h>

#include <stdio.h>

void perror(const char *S);

Функция выводит в стандартный поток об ошибках информацию об ошибочной ситуации, основываясь на значении errno. Строка S, передаваемая функции, предваряет это сообщение.

22.Структура программы на языке с. Параметры главной функции (пример).

Функция является первой функцией, определенной пользователем

(т. е. явно описанной в исходном тексте программы), которой будет передано управление после создания соответствующего окружения запускаемой на выполнение программы. Традиционно функция Main() определяется следующим образом:

Main(int argc, char*argv[],char*enp[]);

Первый аргумент (argc) определяет число параметров, переданных программе, включая ее имя.

Указатели на каждый из параметров передаются в массиве argv [ ], таким образом, через argv[0] адресуется строка, содержащая имя программы,argv[1] указывает на первый параметр и т. д. до argv[argc-1]. Массив envp [] содержит указатели на переменные окружения, передаваемые программе. Стандарт ANSI С определяет только два первых аргумента функции Main()argc и argv. Стандарт POSIX.1 определяет также аргумент envp, хотя рекомендует передачу окружения программы производить через гло-

бальную переменную environ. Объявление: extern char* environ. Environ указывает на массив ссылок, при этом каждая ссылка на конкретную строку окружения.NULL в UNIX- список в никуда.

Пример: выводит значения всех аргументов, переданных функции Main():числопереданных параметров, сами параметры и значения первых 10 переменных окружения:

include <stddef.h>

include <stdIO.h>

extern char**environ; main(int argc, char*argv[]);

{ int i;

Printf(“число передан аргументов %s равно %d\n”,argv[0],argc-1);

for (i=1,i<argc,i++)

{printf(“argv[%d] = %s/n”,i,argc[i];}

for (i=0,i<10,i++)

{if (environ[i]!=NULL) printf(“environ[%d] =%s\n,i,environ[i]);}}

>./a.out first second th

Число переданных пар-ров программе:

a.out=3

argv[1]= first

argv[2]=second

argv[3]=th

environ[0]=logNAME=student……