
лекция2.pptx
- Количество слайдов: 26
Параметры функции main void main(int argc, char *argv[], char *env[]) q Программы на C используют три параметра в main, q Параметр argc содержит количество аргументов командной строки, передаваемых в вашу программу. q Параметр argv представляет собой массив указателей на символьные строки, каждая из которых соответствует одному параметру командной строки. q Параметр env представляет собой массив указателей на символьные строки, указывающих на переменные среды. q Оба набора представлены в виде массивов указателей, причем последний указатель в каждом из массивов имеет значение NULL. q Имена argc и argv являются традиционными, но не обязательными. Эти два параметра в функции main() можно назвать как угодно.
Использование аргументов командной строки Аргументы командной строки это дополнительные информационные элементы, передаваемые программе во время запуска. Они задаются в командной строке и отделяются от имени программы и друг от друга пробелами. . /prog 12 aaa qwe
q argv[0] имя вызываемой программы q argv[1] … argv[1] переданные в программу аргументы q argv[argc] = NULL q argc >= 1 echo Здравствуй, мир!
# ls -l dir 1 argc = 3 argv[0]= ‘ls’ argv[1]= ‘ l’ argv[2]= ‘dir 1’ argv[3]= NULL $ a. out a 1 a 2 a 3 argc = 4 argv[0] = "a. out" argv[1] = "a 1" argv[2] = "a 2" argv[3] = "a 3" argv[4] = NULL
Программа выводит свое имя, количество переданных параметров и значения этих параметров
#include
Использование переменных окружения q ОС UNIX предоставляет каждой выполняемой программе среду выполнения. q Начальные параметры окружающей среды процесса устанавливаются при входе пользователя в систему. q Каждый параметр имеет вид: переменная=строка. q Эти переменные называются переменными окружения. q В последующем они могут быть изменены. q Такие переменные используются для изменения долгосрочного поведения процессов, в отличие от аргументов командной строки. USER — содержит имя текущего пользователя; HOME — содержит путь к начальному каталогу текущего пользователя; PATH — содержит разделенный двоеточиями список каталогов, которые операционная система просматривает в поиске вызванной программы.
Использование переменных окружения
Использование переменных окружения POSIX int main(int argc, char *argv[], char *envp[]); ANSI int main(int argc, char *argv[]); extern char **environ;
Программа выводит все переменные окружения
Управление переменными окружения #include
Управление переменными окружения #include
Управление переменными окружения #include
Контроль программных ошибок В программе на C код возврата указывается в операторе return в функции main или при выполнении вызова функции exit(). Процесс может быть завершен и по независящим от него обстоятельствам, например вследствие получения сигнала. В этом случае функция exit() будет вызвана ядром от имени процесса. #include
Макрос asssert() Используется для включения диагностики в программе. q правильности аргументов функций, q выполнения входных и выходных условий при вызове функций q наличия непредвиденных возвращаемых значений. #include
Макрос asssert() ASSERT отслеживает программные ошибки только в отладочной версии #define DEBUG (стоит по умолчанию). Если программа компилируется как релиз ASSERT убирается препроцессором как комментарии. #define NDEBUG В качестве дополнительного параметра assert может принимать также сообщение, которое надо напечатать в случае срабатывания. assert ( fopen( s. File ), "Couldn't open filen" );
Макрос asssert() #include
#define DEBUG #include
Процедура ATEXIT #include
Понятие системных вызовов Взаимодействие оболочки с ядром происходит с помощью системных вызовов. Системный вызов – это требование к ОС (к ядру) произвести аппаратно (системно) специфическую или привилегированную операцию. Ø Каждому системному вызову соответствует функция (функции) с тем же именем, хранящаяся в библиотеке языка C. Ø Эти функции выполняют необходимое преобразование аргументов и вызывают требуемую процедуру ядра. В этом случае библиотечный код выполняет только роль оболочки, в то время как фактические команды, расположены в ядре ОС (написанные на С или Assemblere). Ø Помимо системных вызовов программисту предлагаются функции общего назначения. Ø Они не являются точками входа в ядро ОС, хотя в ходе выполнения могут выполнять системные вызовы. Ø Эти функции хранятся в системной библиотеке С.
Основные ситуации, приводящие к сбоям системных вызовов: Лимит ресурсов. В системе могут закончиться ресурсы или программа может исчерпать лимит ресурсов, наложенный на нее системой. (Запрос слишком большого объема памяти, или от крытия большого количества файлов одновременно). Ограничение прав доступа. Про грамма пытается выполнить операцию при отсутствии должных привилегий. (Попытка записи в доступный только для чтения файл, обращения к памяти другого процесса или уничтожить программу другого пользователя). Ошибочные аргументы. Ошибочно введенные пользователем данные, либо из за ошибки самой программы (передача системному вызову неправильного адреса памяти или неверного дескриптор файла). Другой вариант ошибки — попытка открыть каталог вместо обычного файла или наоборот. Ошибки устройств. Доступ к аппаратным устройствам, работающих некорректно или не поддерживающим требуемую операцию, либо в дисковод просто не вставлен диск. Внешние воздействия. Например, получение сигнала. Это не обязательно означает ошибку, но ответственность за перезапуск системного вызова возлагается на программу.
Переменная errno Информация об ошибке сохраняется в специальной переменной errno q Переменная errno содержит номер ошибки системы. q Поскольку все системные вызовы работают с одной и той же переменной, переменная errno модифицируется после каждого системного вызова. Поэтому сразу же после завершения функции надо скопировать значение переменной в другое место. q При успешном завершении переменная errno не изменяется и может содержать любой мусор. q Переменная errno реализована в виде макроса, но к ней можно обращаться как к глобальной переменной. q При работе значениями переменной errno удобно использовать макроконстанты, а не реальные числовые значения ошибок. Все эти константы определены в файле
Переменная errno Текст диагностического сообщения хранится в предопределенном массиве sys_errlist, хранящийся в стандартной библиотеке. Переменная sys_nerr содержит размер этого массива. Переменная errno может использоваться как индекс в этом массиве errno error. String number EPERM Operation not permitted 1 ENOENT No such file or directory 2 ESRCH No such process 3 EINTR Interrupted function 4 EIO I/O error 5 … … … В UNIX имеются функции обработки значения errno • strerror() возвращает строковый эквивалент кода ошибки. • perror() по значению errno берет из таблицы sys_errlist соответствующее значение и записывает его непосредственно в поток вывода.
Попытка сделать некоторый системный вызов. Если это не получается, выводится сообщение об ошибке и программа завершает свою работу. #include
Попытка открыть файл. Если это не получается, выводится сообщение об ошибке и программа завершает свою работу. #include
#include