
- •Введение в системное программирование Основные понятия и определения Программы и программное обеспечение
- •Системное программирование
- •Этапы подготовки программы
- •Системное программирование
- •Лекция 1
- •1. Язык Си: Общая характеристика, историческая справкаи основные достоинства
- •2. Подготовка к выполнению и выполнение программ
- •3. Элементы языка с
- •Лекция 2
- •1. Понятие типа данных. Переменные и константы. Операция присваивания
- •2.Типы данных в языке си. Описание данных в программе
- •3. Константы в языке Си
- •4. Арифметические операции и арифметические выражения
- •5. Операции отношения, логические операции и логические выражения
- •6. Автоматическое преобразрвание типов и операция приведения
- •7. Простейшие операторы языка си. Составной оператор
- •Лекция 3
- •3. Инициализация переменных и массивов
- •4. Управляющие конструкции языка си
- •Лекция 4
- •1. Адреса и указатели
- •2. Отождествление массивов и указателей.Адресная арифметика
- •3. Указатели на массивы. Массивы указателей и многомерные массивы
- •4. Динамическое выделение памяти под массивы
- •5. Инициализация указателей
- •Лекция 5
- •1. Функции в языке си. Формальные и фактические параметры. Механизм передачи параметров. Возвращаемые значения
- •2. Использование указателей в качестве аргументов функций
- •3. Предварительное описание функций
- •4. Аргументы командной строки
- •Лекция 6
- •1. Ввод и вывод в языке си: Общие концепции
- •2. Файлы данных и каталоги. Внутренняя организация и типы файлов
- •3. Стандартные функции для работы с файлами и каталогами
- •4. Внешние устройства как специальные файлы. Организация обмена со стандартными внешними устройствами
- •5. Операции ввода/вывода через порты микропроцессоров intel 8086/80286
- •Лекция 7
- •1. Общая структура программы на языке си. Время существования и видимость переменных. Блоки
- •2. Классы памяти
- •3. Рекурсивные вызовы функций. Реализация рекурсивных алгоритмов
- •4. Препроцессор языка Си
- •5. Модели памяти, поддерживаемые компилятором ibm c/2
- •Лекция 8
- •1. Структуры в языке си: основные понятия
- •2. Массивы структур
- •3. Указатели на структуры
- •4. Вложение структур
- •5. Структуры и функции
- •6. Объединения
- •7. Перечисления
- •8. Определение и использование новых типов данных
- •9. Классы имен
4. Аргументы командной строки
Те, кому хоть раз приходилось работать в операционной среде MS DOS, видимо обратили внимание на то, что большинство команд пользовательского интерфейса могут иметь один или более параметров, называемых аргументами командной строки. Так, например, обращение к команде copy, выполняющей копирование файлов, обычно выглядит следующим образом:
copy oldfile.txt newfile.txt
где параметры oldfile.txt и newfile.txt определяют имена файла-источника и файла-приемника соответственно. Эти параметры обрабатываются командным процессором и передаются в тело программы copy, в результате чего последняя узнает о файлах, над которыми должна быть выполнена операция копирования. Можно с уверенностью сказать, что именно наличие параметров делает всевозможные команды удобными для практического использования. Поскольку язык Си часто применяется при разработке системного программного обеспечения, он имеет встроенные средства для получения аргументов команды непосредственно от командного процессора. Такая возможность, на первый взгляд кажущаяся несколько необычной, в действительности находится в полном соответствии с архитектурой этого языка. В самом деле, любая функция, входящая в состав Си-программы, может иметь параметры, через которые она получает необходимую информацию от вызывающей ее функции. Совершенно аналогично, главная функция main(), с которой начинается выполнение всякой программы, могла бы в момент вызова получать исходные данные через аргументы командной строки. Для этого достаточно снабдить функцию main() набором параметров, которые обычно имеют имена argc и argv:
main(argc, argv)
Параметр argc (ARGument Count) является переменной типа int, получающей от командного процессора информацию о количестве аргументов, набранных в командной строке, включая и имя самой команды. Второй параметр argv (ARGument Vector) обычно определяется как массив указателей типа char, каждый из которых хранит адрес начала отдельного слова командной строки. Их описание в программе может выглядеть следующим образом:
int argc;
char *argv[];
В соответствии с принятым соглашением, нулевой элемент argv[0] массива указателей ссылается на строку символов, содержащую имя самой команды и поэтому параметр argc всегда имеет значение большее или равное единице. Следующий элемент argv[1] задает адрес размещения в памяти первого аргумента команды, также представленного последовательностью символов, и т. д. Обращаясь к очередному элементу массива argv нетрудно получить доступ ко всем аргументам командной строки. В качестве примера, иллюстрирующего работу с параметрами функции main(), рассмотрим программу, выводящую на экран терминала свои собственные аргументы и реализующую команду echo в составе оболочки операционной системы MS DOS:
#include <stdio.h>
main(argc, argv)
int argc;
char argv[];
{ int i;
for (i = 1; i <= argc; i++)
printf("%s%c", argv[i], (i < argc-1) ? ' ' : '\n');
}
Поместив теперь загрузочный модуль этой программы в файл echo.exe и обратившись к ней при помощи команды
C:\> echo first second third
получим на экране терминала такое сообщение
first second third
C:\>
представляющее собой простое эхо аргументов командной строки. Поскольку массив указателей в определенном смысле эквивалентен "указателю на указатель" (см. Лекцию 4, $ 3), мы могли бы определить переменную argv в заголовке функции main() как косвенный указатель типа char:
char **argv;
что полностью равносильно предыдущему описанию. В этих терминах наша программа echo могла бы выглядеть, например, следующим образом:
#include <stdio.h>
main(argc, argv)
int argc;
char **argv;
{ while (--argc > 0)
printf((argc > 1) ? "%s " : "%s\n", *++argv);
}
где выражение ++argv увеличивает на единицу значение указателя, заставляя его ссылаться на очередную строку, полученную от командного процессора.