Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

5.10.2. Обработка ошибок

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

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

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

Рассмотрим более подробно обработку ошибок, возникающих при выполнении системных вызовов с использованием переменной errno. Заметим, что значение errno не обнуляется следующим нормально завершившимся системным вызовом. Следовательно, значение errno имеет смысл только после вызова, который завершился с ошибкой.

Стандарт ANSI C определяет две функции, помогающие сообщить причину ошибочной ситуации:

#include <string.h>

char *strerror(int errnum);

и

#include <errno.h>

#include <stdio.h>

void perror(const char *s).

Функция strerror() принимает в качестве аргумента errnum номер ошибки и возвращает указатель на строку, содержащую сообщение о причине ошибочной ситуации. Функция perror() выводит в стандартный поток сообщений об ошибках (обычно на экран) содержимое строкиs и вслед за ним – системную информацию об ошибочной ситуации, основываясь на значении переменной errno.

5.11. Формальные параметры функции main

Запуск программного файла на выполнение равносилен вызову функции main. Функция main также может иметь формальные параметры, но, в отличие от остальных функций, её параметры не могут задаваться произвольно. Количество, порядок следования и семантика формальных параметров функции main строго определены. Кроме того, аргументы передаются формальным параметрам функции main при запуске программы из командной строки и из переменных окружения (системные переменные ОС). Функция main с формальными параметрами имеет вид:

<спецификация_типа> main(int argc, char *argv[],char *env[])

{…}

Семантика формальных параметров функции main следующая:

argc   – количество аргументов командной строки;

argv   – массив указателей на аргументы командной строки;

env     – массив указателей на переменные окружения.

Для передачи аргументов командной строки функции main они размещаются в командной строке вслед за именем исполняемого файла. Аргументы передаются в виде символьных строк (заключать в двойные кавычки не обязательно). Аргументы отделяются друг от друга пробелами или символами горизонтальной табуляции. Если требуется передать программе строку аргумента, содержащую внутри себя пробелы или символы горизонтальной табуляции, следует заключить её в двойные кавычки.

Массив argv имеет следующее содержание:

argv[0] – указатель строки с полным именем исполняемого файла в файловой системе;

argv[1] – указатель строки первого аргумента;

argv[2] – указатель строки второго аргумента;

argv[argc-1] – указатель строки последнего аргумента;

argv[argc] – нулевой указатель – NULL.

Значение формального параметра argc не может быть меньше 1. Если значение argc равно 1, это означает, что аргументы в командной строке отсутствуют.

Массив env, начиная с env[0], содержит указатели на строки переменных окружения вида:

<идентификатор>=<значение>

Идентификатор является именем переменной окружения, затем следует знак равенства и оставшаяся часть строки интерпретируется как значение переменной окружения. Последний элемент массива env содержит нулевой указатель – NULL.

Задавать все параметры функции main не обязательно. Они используются по необходимости. Допустимы следующие объявления формальных параметров:

main()

main(int argc)

main(int argc, char *argv[])

main(int argc, char *argv[],char *env[])

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

Пример:

/* Программа ARGS.C */

 

#include <stdio.h>

#include <stdlib.h>

 int main(int argc, char *argv[], char *env[]){

int i;

 printf("Значение argc = %d \n\n", argc);

printf("Функции main передано %d аргументов в командной \

строке: \n\n",argc);

 for (i = 0; i < argc; i++)

printf("argv[%d]: %s\n", i, argv[i]);

 printf("\nПереданы следующие значения переменных среды:\n\n");

 for (i = 0; env[i] != NULL; i++)

printf(" env[%d]: %s\n", i, env[i]);

 return 0;

}

 

Предположим, что полученный в результате компиляции программныймодуль имеет полное имя /root/home/args, находится в текущем каталоге и запущен на выполнение командой:

 

$ args   first_arg "арг с пробелами" 3 4 "предпоследний арг" stop!

Заметим, что можно передавать аргументы, содержащие пробелы, заключив эти аргументы в двойные кавычки, как показано выше в примере командной строки: "арг с пробелами" и "предпоследний арг".

Результат выполнения программыargs (предполагая, что заданы переменные среды, имеющие представленные ниже значения) будет выглядеть на экране в виде:

 

Значение argc равно 7

 Функции main передано 7 аргументов в командной строке:

 

argv[0]: /root/home/args

argv[1]: first_arg

argv[2]: aрг с пробелами

argv[3]: 3

argv[4]: 4

argv[5]: предпоследний арг

argv[6]: stop!

 

Переданы следующие значения переменных среды:

 

env[0]: PROMPT=$p   $g

env[1]: PATH=/SPRINT; /GCC