GeoSELECT.ru



Компьютеры / Реферат: Автоматическое рабочее место для работника склада (Компьютеры)

Космонавтика
Уфология
Авиация
Административное право
Арбитражный процесс
Архитектура
Астрология
Астрономия
Аудит
Банковское дело
Безопасность жизнедеятельности
Биология
Биржевое дело
Ботаника
Бухгалтерский учет
Валютные отношения
Ветеринария
Военная кафедра
География
Геодезия
Геология
Геополитика
Государство и право
Гражданское право и процесс
Делопроизводство
Деньги и кредит
Естествознание
Журналистика
Зоология
Инвестиции
Иностранные языки
Информатика
Искусство и культура
Исторические личности
История
Кибернетика
Коммуникации и связь
Компьютеры
Косметология
Криминалистика
Криминология
Криптология
Кулинария
Культурология
Литература
Литература : зарубежная
Литература : русская
Логика
Логистика
Маркетинг
Масс-медиа и реклама
Математика
Международное публичное право
Международное частное право
Международные отношения
Менеджмент
Металлургия
Мифология
Москвоведение
Музыка
Муниципальное право
Налоги
Начертательная геометрия
Оккультизм
Педагогика
Полиграфия
Политология
Право
Предпринимательство
Программирование
Психология
Радиоэлектроника
Религия
Риторика
Сельское хозяйство
Социология
Спорт
Статистика
Страхование
Строительство
Схемотехника
Таможенная система
Теория государства и права
Теория организации
Теплотехника
Технология
Товароведение
Транспорт
Трудовое право
Туризм
Уголовное право и процесс
Управление
Физика
Физкультура
Философия
Финансы
Фотография
Химия
Хозяйственное право
Цифровые устройства
Экологическое право
   

Реферат: Автоматическое рабочее место для работника склада (Компьютеры)



ВВедение.
Данная программа автоматизированного рабочего места разработана для
работников складских помещений, естественно если у них имеется компьютер
классом не ниже Pentium. Сейчас на рынке программного обеспечения
появляются все больше и больше различных программ для работы не только со
складом, но и различные другие программные средства автоматизированного
рабочего места, но стоимость их лицензионных копий доходит порой до
нескольких десятков тысяч, а моя программа может быть конечно маленько еще
«сыровата», но в процессе работы с нею её можно «довести ее до ума» и все
это лишь за пятерку по программированию цена не велика за произведение
программного искусства. Каковы её плюсы: ну это естественно простота и
понятность (для русского человека) интерфейса программы, что не требует
дополнительного обучения или прохождения специальных курсов, особенно для
женщин, работающих на складах и не посвященных в азы компьютеров и
программного обеспечения; не требовательность к системным ресурсам машины;
легкость ввода и отслеживания; простота резервирования базы данных (всего 1
файл), что не маловажно для такой программы. При написании и разработке
курсового проекта я научился работать с Borland Pascal, Microsoft Windows
95OSR2, Microsoft Word 97 SR-2 которые использовались для работы над
курсовым проектом, научился использовать справку и другие функции Borland
Pascal при этом даже разобрался с английским языком и использованием
электронных словарей переводчиков таких как Promt, Stylus, Magic Gooddy 98.
Огромное спасибо Волкову А.И. – за отличное преподавание предметов, Billу
Gaits – за то что он умеет зарабатывать деньги собственным умом, Мерзлякову
Д.С. – за поддержку в трудную минуту, Барышеву А.А. – за техническую
поддержку, Русских А.И. – за программную поддержку, Казакову В.С. – за
разрешение работать на компьютере, Sting, Queen, и другим за хорошую музыку
во время работы над курсовым.
I. Задание.
Составить программу автоматического рабочего места для работы со
складом.
Программа должна предоставлять пользователю возможность:
1. Вводить новый товар, указывая следующие параметры
V Наименование;
V Количество;
V Цену;
V Дату поступления.
2. Осуществлять поиск товара по наименованию и выдавать его параметры.
3. Помечать выбывший товар, указывая дату выдачи.
4. Выводить список имеющегося товара с возможностью сортировки по любому
параметру.
5. Выводить список выбывшего товара с возможностью сортировки по любому
параметру.
6. Выдавать общую статистическую характеристику:
V Общая стоимость имеющегося товара;
V Количество имеющегося товара;
V Количество выбывшего товара.
7. Сохранять и восстанавливать всю информацию АРМ с диска.


I. описание переменных и алгоритма работы программы.
Описание переменных.
V basskl – основная запись с необходимыми переменными это:
> naim – наименование товара;
> kol – количество товара;
> price – цена товара;
> kol_p – количество пришедшего товара;
> kol_r – количество товара который ушел;
> date_p – дата прихода товара;
> date_r – дата расхода товара.
V f – file базы слада;
V list – массив данных базы;
V schet – cчетчик;
V curs – показатель позиции;
V stran – счетчик позиции курсора;
V i – переменная использования;
V mcurs – переменная начальной позиции меню;
V k –переменная определения клавиши;
V res –переменная выбора меню;
V da – переменная использования;
V er – переменная ошибки преобразования;
V tx – переменная текста при поиске;
V fil – переменная имени базы;
V key – флажок;
V seter – переменная использования.

Кроме переменных в программе используются процедуры и функции описание
которых приведено ниже;
Функция probel;
Используется для дополнения текста требуемыми количествами пробелов.
Вход: Текст, требуемая длина.
Выход: Текст требуемой длины.

Функция Edtext;
Используется для вывода на экран в нужную позицию текста и его последующего
редактирования
Функция работает следующим образом:
Зацикливается до тех пор пока не будет нажатия Enter или Esc. В это время
выводит на экран текст в нужную позицию, обновляется , ожидает нажатия
клавиш или delete.
Вход: Координаты, текст, длина текста, флажок.
Выход: Вывод на экран текста, отредактированный текст.

Функция Cifri;
Подобна функции Edtext только ввод текста ограничен цифрами.
Работает также.

Процедура Prishlo;
Применяется для вывода на экран меню «Приход» и занесения данных в позицию
базы.
Описание работы: Работает со строкой массива базы. Выводит на экран меню
«Приход», преобразует текстовые переменные после ввода в строки меню.

Процедура Ushlo;
Аналогична процедуре Prishlo .Заменена только формула вычисления
количества.


Процедура Vvodnov;
Процедура обеспечивающая вывод на экран меню «Новый товар», ввод новой
строки в базу.
Работает: Ограничивается строкой, для работы с переменными записи, выводит
на экран меню, пользователем редактируются строки меню, преобразуются,
увеличивается счетчик числа строк базы на 1.

Процедура Edzapic;
Используется для редактирования записи в текущей позиции курсора листинга
перечня товаров.
Вход: Позиция
Выход: отредактированный текст в данной позиции.

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

Функция Vivstr;
Формирует строку по позиции в базе.
Обнуляется. Работает со строкой в массиве базы. Производит преобразование в
стринговые переменные числовых значений базы (количества цены, приход,
расход), сумма формируется путем вычисления. Добавление нужными пробелами
функцией Probel.

Процедура Vivlist;
Обеспечивает формирование экрана с помощью процедуры Ekran, вывод
поясняющей строки. Подкрашивание строки в позиции курсора, опрос клавиш
курсора и служебных (для ввода новой, корректировки, удаления). Работает
следующим образом: Выполняет процедуру Ekran, прорисовывает строку
пояснения, цикл пока не нажата клавиша «влево», «вправо», «Enter», «Esc» –
опрашивает клавиатуру с помощью функции «Readkey» если нажата «Вниз» или
«Вверх» уменьшаетя или увеличивается соответственно текущий счетчик позиций
меню

Функция Vstroca;
Функция организует главное меню в верхней строке экрана.
Устанавливает параметры цвета, выводит на экран массив с переменными меню
т.е. названиями меню. Опрашивает клавиатуру на нажатие клавиши «Влево»,
«Вправо», «Enter» выполняет соответствующие этим клавишам команды. Затем
если было нажато «Esc» функция принимает значение меньшее 1 и затем в
головной программе происходит выход.

Процедура Sortirovka;
Сортирует данные по заданной колонке.
Организуется цикл на все позиции массива базы. База переносит данные в
стороннюю базу. Выбирает столбец сортировки сравнивает со сторонней базой
если больше то переносит в стороннюю базу запоминает позицию. В конце цикла
переставляет позиции основной базы.
Описание алгоритма работы программы.
Очищается экран выводится меню для указания месторасположения и названия
файла базы по умолчанию это «С:base.dat» затем проверяется создан ли файл
если нет то создается. Организуется цикл до конца файла переписываются
данные в массив базы. Обнуляются переменные. организуется меню по данным
функции Vstroka затем происходи выбор с помощью оператора Case по которому
осуществляются переходы. В случае «1» прихода функции Vstroka выводится
листинг данных базы и заголовков, организация движения курсора по строкам
базы при помощи процедуры Vivlist. В случае результата «2» формируется окно
с тенью «Пришло», заполняется окно с помощью процедуры Prishlo по текущей
позиции курсора экрана и листинга. «3» формируется окно «Расход»,
заполняется с помощью процедуры Ushlo. «4» организуется окно «Найти
наименование» вводится текст с помощью функции Edtext. сравнивается с
наименованиями базы если находит устанавливает курсор на это место. Если не
находит выводит сообщение и устанавливает на конечную позицию. «5» Окно
сортировки. Выполняется процедура Sortirovka. При других значениях функции
Vstroca происходит запись файла базы, закрытие файла.
II. Алгоритм программы.
IV. Текст программы.
Program kursovoi;
uses crt;
type basskl = record
naim:string[40];
kol:integer;
price:single;
kol_p:integer;
date_p:string[8];
kol_r:integer;
date_r:string[8];
end;

var f:file of basskl;
List:array[0..255] of basskl;
Schet:Integer;
curs,stran,i,mcurs:integer;
k:char;
Res,da,er,seter:Integer;
Tx,files:String;
key:boolean;
const
mnu:array[1..6] of string[13]=(
' Ввод ',
' Приход ',
' Расход ',
' Найти ',
' Сортировка ',
' Выход ');

function Probel(Text:String;Len:Integer):String;
begin
While length(Text)1 then dec(curs) else curs:=6;
#77: if cursList[j].naim then begin Bas:=List[j]; k:=j end;
2: if Bas.kol>List[j].kol then begin Bas:=List[j]; k:=j end;
3: if Bas.price>List[j].price then begin Bas:=List[j]; k:=j end;
5: if Bas.kol_p>List[j].kol_p then begin Bas:=List[j]; k:=j end;
6: if Bas.date_p>List[j].date_p then begin Bas:=List[j]; k:=j end;
7: if Bas.kol_r>List[j].kol_r then begin Bas:=List[j]; k:=j end;
8: if Bas.date_r>List[j].date_r then begin Bas:=List[j]; k:=j end;
end;
end;
List[k]:=List[i]; List[i]:=Bas;
end;
end;

procedure Vivlist(var seek,curs:integer);
var c,k:char;
i:integer;
begin
Ekran;
Textbackground(3);
gotoxy(1,24); write(Probel(' - меню | Ins - Добавить | Ctrl+F8 -
Удалить | Ctrl+Enter - Изменить',79));
Textbackground(15);
TextColor(1);
gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
repeat
c:=readkey;
Textbackground(5);
TextColor(14);
gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
if c=#0 then k:=readkey;
case k of
#72: begin {Вверх курсор}
if (curs=1) and (stran>0) then begin dec(stran); Ekran end;
if (curs>1) then dec(curs);
end;
#80: begin {Вниз курсор}
if (curs=20) and (stran+20 |Перенаправление вывода в файл |program > out_file|
|>> |Перенаправление вывода в файл с |Program >> |
| |добавлением |out_file |


Пайпы. Две или более программ могут быть объединены таким образом что
результат одной программы попадет на вход другой. При этом данные от одной
программы к другой следуют через програмный канал, например:

program1 | program2 | program3

или более реалистичный пример:

ls –l /etc | more

Примечание: пайпы всегда работают лишь в одном направлении – со
стандартного выхода одной к стандартному входу другой программы.

Расширение имен файлов.

В целях уменьшения количества набираемых символов при вводе имен файлов шел
поддерживает метасимволы. Нпример для того чтобы вывести листинг всех
файлов в текущей директории имена которых начинаются с буквы a достаточно
воспользоваться командой ls –l a*

ниже приведена таблица основных метасимволов

|Метасимвол |Описание |
|* |Означает любой символ в любом количестве |
|~ |Означает путь к домашнему каталогу |
|? |Любой символ в количестве один или больше |
|[ … ] |Равенство любого одного из символов заключенных|
| |в скобки. Пара символов разделенная знаком |
| |минус означает любой символ из промежутка между|
| |ними. Например [a-zA-Z] – любаялатинская буква |


5. Shell скрипты

Выполнение скриптов.

Несколько команд обьедененных одной последовательностью выполнения
называется скриптом. Например последовательное выполнения команд, пайпы
являются простейшими скриптами. Обычно команды из которых состоят скрипты
сохраняют в файлах. Для запуска скрипта можно воспользоваться двумя
методами:

sh

или установить атрибут выполняемости на файл командой

chmod +x

После чего можно выполнять скрипт:

./



Вывод текста.

Для формирования вывода текстовой информации в скриптах используют команду

echo “строка”

Файл .profile .

Каждый раз во время входа в систему Bourne Shell автоматически запускает
файл .profile (скрипт) находящийся в вашей домашней директории. Этот скрипт
устанавливает “окружение” в котором Вам предстоит работать. Это различные
переменные окружения отвечающие за вид системной подсказки, путь поиска
исполняемых файлов, тип терминала и.т.п. Приведем список основных
переменных окружения.

. PATH устанавливает путь поиска исполняемых файлов и представляет собой
набор директорий разделенных двоеточием
. MAIL определяет имя файла почтового ящика для уведомления о приходе новой
электронной почты
. MAILCHECK параметр показывающий как часто (в секундах) следует проверять
почтовый ящик на предмет прихода новой почты
. HOME определяет домашний каталог (каталог по умолчанию). Команда cd без
параметров выполняет переход в этот каталог.
. PS1 основная системная подсказка (по умолчаию $)
. PS2 вторичная системная подсказка (по умолчанию >)
. SHELL имя логин шелла пользователя
. TERM тип терминала пользователя
. EDITOR имя текстового редактора по умолчанию

Устанавливать переменные окружения можно по разному. Например команды


PATH=/bin:/usr/bin:/usr/sbin:/usr/contrib/bin:/usr/local/bin

и

PATH=/bin:/usr/bin:/usr/sbin
PATH=$PATH: :/usr/contrib/bin:/usr/local/bin

полностью эквивалентны. Для того чтобы эти переменные вошли в системное
окружение (кроме шела, стали доступны и другим программам) необходимо
выполнит команду

export

Комментарии.

Текст следующий за символом # рассматривается шелом как комментарий и не
оказывает никакого влияния на работу скрипта.


Основы программирования на языке shell


Параметры.

В дополнение к стандартным параметрам шела можно создавать свои параметры,
кторые затем можно использовать в командах. Например

$ x=test
$ echo $x
test

$ aaa=/
$ ls $aaa

cdrom home nsmail tcb var
SD_CDROM dev lib opt tmp
TT_DB etc lost+found sbin tmp_mnt
Bin export net stand usr

При включении параметров в строку или в выражение знак $ должен
предшествовать параметру. Также необходимо пользоваться следующими
правилами:

${parameter} значение параметра заключенного в скобки будет
использовано в выражении. Скобки {} используются когда за
параметром следуют буквы или цифры не относящиеся к
парамаметру. Например если значение параметра xxx равно
test то значение выражения ${xxx}123 будет равняться
test123

${parameter:-word} если параметр установлен и не пустой то результатом
выражения будет являться значение параметра, в противном
случае в результате будет использовано значение параметра
word. Например: ${xxx:-/usr/bin/sh}
если xxx пустой то результатом выражения будет являться строка
/usr/bin/sh

${parameter:=word} если параметр неустановлен или пустой, тогда
значение word будет результатом выражения.
${parameter:+word} если параметр установлен и не пустой, тогда
результатом выражения является word, в противном случае
результат пустой.

Аргументы командной строки.

Когда Вы запускаете на выполнение программы, Вы можете передавать ей один
или больше аргументов. Шелл скрипты имеют доступ к этим аргументам
посредством параметров $0, $1, $2 …$9. Если аргументов больше девяти, их
значения помещаются в буффер и могут быть доступны с использованием
команды shift которая будет обсуждаться ниже. Параметр $0 всегда принимает
значение имени выполняемого файла, $1 – первого аргумента командной строки,
$2 – второго, и.т.п.
Количество агрументов командной строки всегда можно узнать проанализировав
параметр $#. В том случае если Вам необходим один параметр содержащий все
аргументы командной строки разделенные пробелом нужно воспоьзоваться
параметром $*.
Для получения доступа к аргументам с номером больше девяти необходимо
воспользоваться командой shift. После очередного выполнения команды shift
происходит сдвиг на один элемент в буффере параметров в результате которого
значение параметра $2 получает параметр $1, значение параметра $3 получает
$2, и.т.п. Используя цикл (цыклы будут рассвотрены ниже) в сочетании с
командой shift можно получать доступ ко всем аргументам командной строки с
номерами превышающими 9.

Квотинг.

Очень часто случаются ситуации когда необходима особая трактовка тех
символов которые шелл воспринимает как спец символы. Например случай когда
строку текста включая пробелы нужно передать как один аргумент или знак $
должен не быть воспринят как указатель на параметр. Для этих целей
используется квотинг (quoting).
Например символ бекслэша ( ) можно использовать для квотинга символа $.
$ param=aaa
$ echo $param
aaa

$ echo $param
$param

В сочетании с бекслэшем для квотинга можно использовать двойные кавычки.
Например:


echo "$param is a "new directory""
aaa is a "new directory"

При этом знак $ внутри двойных кавычек интерпретируется как указатель на
параметр а бэкслэш используется для “экранирования” внутренних кавычек.

Одинарные кавычки также можно использовать для квотинга но в отличии от
двойных они “экранируют” все что находится внутри них. Разница сразу
становится понятной после замены в предыдущем примере двойных кавычек
однираными:

$ echo '$param is a "new directory"'
$param is a "new directory"

Подстановка команд.

Символ обратного ударения ( ` ) используемый в скриптах указывает на
подстановку команд. Это подразумевает что результат вывода команды
подставляется в шелл как параметр. Нпример:

$ echo "The current date is `date`"

The current date is Sat Jan 6 04:16:35 GMT 2001

или

$ users=`who`
$ echo "Users currentrly logged in the system:n $users"
Users currentrly logged in the system:
root console Jan 6 03:57
roman pts/0 Jan 5 23:12

Условия.

Очень часто случаются ситуации при написании скриптов когда необходимо
выполнять те или иные команды в зависимости от конкретных условий.
Например, нужно отсортировать файл, а в случае его отсутствия вывести
сообщение об ошибке. На этот случай шелл имеет условный оператор, и
указанная задача решается с его использованием следующим образом:


if test –f $1
then
sort $1
else
echo “file $1 doesn’t exist”
fi

Условный оператор имеет следующий синтаксис:

if
then
elif
then
…..
else
fi

Оператор if проверяет статус выполненной команды (в данном примере test
–f)
И в случае успеха (программа возвращает 0) выполняет команды стоящие после
then, в противном случае выполняются команды else/elif.

Наиболее часто используемой командой в оператореусловия является команда
test. Она имеет множество опций, полный список которых можно получить
обратившись к ее документации выполнив команду man test.Очень часто вместо
команды test используют команду [ которая является ее фунуциональным
аналогом. Здесь приводится лишь краткий список основных опций команды test.



-r file возвращает успех если файл существует и доступен для
чтения.

-w file возвращает успех если файл существует и доступен
для записи.

-x file возвращает успех если файл существует и
выполняемый.

-f file возвращает успех если это регулярный файл.

-d file возвращает успех если это директория.

-c file возвращает успех если это специальный файл.

-s file возвращает успех если файл имеет ненулевой
размер.

-h file возвращает успех если это симлинк.

-z s1 возвращает успех если длинна строки s1
нулевая.

-n s1 возвращает успех если длинна строки s1 ненулевая.

s1 = s2 проверка двух строк на равенство.

s1 != s2 проверка двух строк на неравенство

s1 возвращает успех если строка s1 непустая

n1 -eq n2 Алгебраическая проверка двух чисел n1 и n2 на
равенство. Помимо –eq есть еще ряд опций для алгебраического
сравнения такие как -ne, -gt, -ge, …

Все вышеперечисленные условия могут обьеденяться с использованием
логических операторов:

! отрицание

-a Бинарный И

-o Юинарный ИЛИ (-а имеет приоритет больший чем –о)

( expr ) Группировка выражений скобками


Ввод данных.

Для ввода иданных в скрипт можно воспользоваться командой

read [parameter …]

которая в качестве аргументов принимает список из одного или более
параметров.

Примечание: знак $ перед именем параметра в команде read ставить не нужно.



Циклы.

Очень часто при составлении скриптов простого последовательного выполнения
бывает недостаточно. Необходимы механизмы которые позволяли бы выполнять
команды с изменяющимися параметрами. Для этих целей шелл предоставляет в
распоряжение три цикличекие конструкции: циклы for,while и untill.


Цыкл for

Этот тип циклов позволяет выполнять один и тот же набор команд каждый раз с
новыми значениями полученными из списка параметров. Он имеет следующий
формат:

for parameter [ in wordlist ]
do command-list
done

где parameter это любое имя параметра, wordlist – один или несколько
значений последовательно присваиваемых параметру, command-list – набор
команд выполняемых при каждом проходе цикла. wordlist может быть либо
просто набором аргументов разделенных пробелом, либо командой шелла которая
генерирует сама аргументы. Например следующий скрипт:

for i in 1 2 3 4 5
do
if mkdir $i
then
echo “directory $i was created”
fi
done

создает последовательно директории с именами 1 2 3 4 5 и в случае успешного
создания директории выдает сообщение. Следующий скрипт:

for i in `ls a*`
do
cp $i /tmp
echo “$i was copied”
done

копирует все файлы начинающиеся с буквы a из текущего каталога в каталог
/tmp.

Цикл while

while command-list1
do command-list2
done

этот цикл запускает команды из списка command-list1, и если последняя
команда из списка выполнилась успешно (код возврата равен 0) то начинают
выполняться команды из списка command-list2, в противном случае цикл
заканчивается. Цикл из следующего примера:

while [ -r $1 ]
do
echo “processing $1”
cat $1 >> summary
shift
done

по очереди считывает аргументы командной строки, в случае когда в текущем
каталоге присутствует файл доступный на чтение с именем совпадающим с этим
аргументом, содержимое этого файла дописывается к файлу с именем summary. В
противном случае, скрипт прекращает свою работу.

Цикл util

until command-list1
do command-list2
done

конструкция этого цикла полностью аналогична циклу while за исключением
того что тело цикла (набор команд command-list2) выполняется как минимум
один раз не зависимо от успешности выполнения условия цикла (набор команд
command-list1).

Оператор case

Оператор case является расширением стандартного условного оператора if.
Если есть условие при котором может реализовываться множество вариантов то
вместо серии операторов if лучше использовать один case.

case parameter in
pattern1 [ | pattern2 …] ) command-list1 ;;
pattern2 [ | pattern3 …] ) command-list2 ;;

esac

шаблоны pattern определяют варианты параметра parameter. При совпадении
параметра с одним из шаблонов будет выполнен соответствующий список команд
command-list. В квадратных скобках ([ | pattern2…] ) указаны дополнительные
варианты разделенные символом ( | ) которые может принимать parameter
помимо основного. Заканчивается список шаблонов скобкой. Более понятней
структура этого оператора станет после рассмотрения примера:



case $i in
-d | -c ) mkdir dir1
echo “directory dir1 was created” ;;
-r ) rmdir dir1
echo “directory dir1 was removed” ;;
* ) echo “invalid option” ;;
esac

В этом примере скрипт получив при запуске один из аргументов –d или –c
попытается создать директорию с именем dir1 , получив аргумент –r
попытается ее стереть. Во всех остальных случаях (шаблон *) он выдаст
предупреждение о неправильном аргументе.

Примечание: обратите внимание на то что порядок следования гшаблонов в
операторе case имеет большое значение. Так если строку

* ) echo “invalid option” ;;

поставить в самое начало, то на ней будет все время терминироваться скрипт.

Команда . (точка)

Каждый раз когда Вы запускаете шелл программы, создается еще одна копия
шелла в которой они выполняются. Поэтому если Вы написали шелл скрипт, то
все переменные “живут” только во время выполнения скрипта. Если вы хотите
чтобы все переменные из шелл программы были в вашем текущем окружении
запускать скрипт нужно в текущем шеле, это достигается использованием
команды . (точка).

. scriptname

Команда eval
eval [arg ...]

Аргументы читаються и соединяются в одну команду. Затем эта команда
выполняется шеллом и статус выхода команды возвращается как результат
команды eval. Если аргументы в команде отсутствуют или пустые то команда
возвращает нулевой статус.
В качестве примера рассмотрим два скрипта:

d=’date &’ ; $d
и
d=’eval date &’ ; $d

первый из них не выполнится так как команда date воспримет символ & как
аргумент а не как признак запуска в фоновом режиме, в результате чего
первый скрипт не выполнится в отличии от второго.

Использование метасимволов.

Во всех конструкциях циклов и операторе case возможно использование
метасимволов. Например скрипт из примера оператора цикла for

for i in `ls a*`
do
cp $i /tmp
echo “$i was copied”
done

можно переписать в более простом виде

for i in a*
do
cp $i /tmp
echo “$i was copied”
done

результат будет один и тот же.

2.3.1 Некоторые специальные команды

Разделители && и ||

Это условные разделители. При разделении двух команд с помощью && вторая
команда выполнится лишь в том случае когда первая завершится успешно. При
разделении команд с помощью || вторая выполнится лишь тогда когда первая
закончилась неуспешно (код возврата не равен нулю).
Например при выполнении скрипта:


test –d /usr/tools && cd /usr/tools


test –d /usr/tools || echo “directory doesn’t exist”


вход в директорию /usr/tools будет произведен только при ее наличии, в
противном случае будет выдано сообщение о ее отсутствии.



Определение функций


Для сокращения обьема шелл программ и упрощения их понимания и сопровждения
шелл допускает введение и использование функций. Для опредения функции
используется следующий синтаксис:

name () { list; }

где name – это имя функции, а list – список команд из которых состоит тело
функции. Ниже приведен пример функции возвращающей 0 если аргумент
переданный ей является директорией и 1 в противном случае.

dir_test () {
if [ -d $1 ]
then
echo “$1 is a directory”
return 0
else
echo “$1 is not directory”
return 1
fi;
}

вызов функции осуществляется следующим образом

name [ parameter … ]

например в нашем случае это можно сделать так

dir_test /usr/bin/sh


Перенаправление ввода-вывода


Как было сказано выше для перенаправления ввода-вывода используються
символы (> перенаправление вывода, >> перенаправление вывода с добавлением
в файл и < перенаправление ввода). Кроме этого существует еще ряд
конструкций, одна из которых:

word is found
> mark
These words will be printed
the cat command until the "mark"
word is found
$

Если перед строчкой word стоит минус то все символы табуляции в начале
строк будут вырезаны.

Другой часто используемой конструкцией при перенаправлении ввода-вывода
является:

& цифра

При этом задействуется файловый дискриптор ассоциированый с указаной
цифрой. В большинстве программ со стандартным вводом связан дискриптор 0,
со стандартным выводом дискриптор 1, и со стандартным потоком ошибок
дискриптор 2. Все программы которые работают друг с другом через пайпы по
умолчанию пользуються дискрипторами 0 и 1. Наиболее часто используемые
перенаправления это 1>&2 и 2>&1. Рассмотрим следующий пример из которого
станет понятен смысл этих конструкций:

$ ls /no/such/file > out
/no/such/file not found
$ cat out
$
$ ls /no/such/file >out 2>&1
$ cat out
/no/such/file not found
$

первая команда пытается вывести листинг не суцествующего файла перенаправив
стандартный вывод в файл out. Файл out при этом оказывется пустым т.к.
сообщение об ошибке выводится в стандартный поток ошибок и появляется на
терминале. Вторая команда объединяет стандартный поток ошибок со
стандартным выводом который перенаправлен в файл out. При этом сообщения об
ошибке попадают в файл, о чем свидетельствует команда cat.

Команда exec
exec [arg …]

Эта команда выполняет замещение текущего шела новым шелом или программой.
Разница между простым запуском шела и запуском через exec становится
очевидной на следующем примере:

$ ksh
$ ps
PID TTY TIME COMMAND
2125 pts/0 0:00 ksh
2094 pts/0 0:00 sh
2126 pts/0 0:00 ps
$

$ exec ksh
$ ps
PID TTY TIME COMMAND
2127 pts/0 0:00 ps
2094 pts/0 0:00 ksh
$

Команда expr
expr expression { +, -, *, /, *, =, >, >=, = operand2 )

|Операци|Описание |
|я | |
|> |Больше |
|< |Меньше |
|>= |Больше или равно |
|> |Правый битовый сдвиг |
| font_file.pcf.Z


Программирование на HP-UX



Для создания выполняемых програм, нужно скомпилировать исходный код где
содержиться главная програма.
Расмотрим пример компиляции.
$ cc –Aa myprog.c
Процес компиляции покадет все сообщения (статус,предупреждения,
ошибки) на стандартный поток вывода ошибок (stderr). После этого компилятор
создаст файл a.out который уже можно запускать. Аналогично можно
скомпиларовать Фортрановскую прогамму командой f77. Если програма состоит
из несколько файлов, то омпиляция будет выглядет следующем образом:
$ cc –Aa main.c myfunc.c
main.c:
myfunc.c:

после этого можно будет запускать a.out.

Можно сказать что процес компиляции похожий как на рисунке:



На самом деле процесс компиляции намноого сложнее. Этот процес компиляции
занимает несколько этапов.
1) Для каждого исходного файла запускаеться компилятор который создает
обьектный файл (если исходные коды написаны на разных языках
програмирования, то для каждого запускаеться тот соотвествующий
компилятор)
2) После компиляция (этап создания) обьектных файлов запускаеться линковщик
(HP-UX linker (ld))
На картинке можете увидеть более детальный процес компиляции:



Для более детального просмтотра этапов прохождения компиляции, можно
посмотреть задав опцию –v (verbose)

$ cc -Aa -v main.c myfunc.c
cc: CCOPTS is not set.
main.c:
/opt/langtools/lbin/cpp.ansi main.c /var/tmp/ctmAAAa16327 -D__hp9000s700
-D__hp9000s800 -D__hppa -D__hpux -D__unix -D_PA_RISC1_1
cc: Entering Preprocessor.
/opt/ansic/lbin/ccom /var/tmp/ctmAAAa16327 main.o
-Oq00,al,ag,cn,Lm,sz,Ic,vo,lc,mf,Po,es,rs,sp,in,vc,pi,fa,pe,Rr,Fl,pv,pa,nf,c
p,lx,st,ap,Pg,ug,lu,dp,fs,bp,wp! -Aa
myfunc.c:
/opt/langtools/lbin/cpp.ansi myfunc.c /var/tmp/ctmAAAa16327 -D__hp9000s700
-D__hp9000s800 -D__hppa -D__hpux -D__unix -D_PA_RISC1_1
cc: Entering Preprocessor.
/opt/ansic/lbin/ccom /var/tmp/ctmAAAa16327 myfunc.o
-Oq00,al,ag,cn,Lm,sz,Ic,vo,lc,mf,Po,es,rs,sp,in,vc,pi,fa,pe,Rr,Fl,pv,pa,nf,c
p,lx,st,ap,Pg,ug,lu,dp,fs,bp,wp! -Aa
cc: LPATH is /usr/lib/pa1.1:/usr/lib:/opt/langtools/lib:
/usr/ccs/bin/ld /opt/langtools/lib/crt0.o -u main main.o myfunc.o -lc
cc: Entering Link editor.

Из этого примера можно посмотреть такие этапы
cpp.ansi это С препроцесор после этого запускаеться /lib/ccom – эта
програма(компилятор) уже создает .о файлы. Последний этап это этап создания
исполняемого кода, это Линкер, которые связывает все обьекты .

Что такое Обьектный файл ?
Обьектный файл содержет машиные инструкции а данные с которых линкеровщик
создает исполняемую програму. Каждий обьектный файл содержит НАЗВАНИЕ
(symbol name) и ссылку на это название.
Названия делятся на 3 категории:
1) Локальные обьявления (local definition) – это коды или данные которые
могут использоваться только в том обьектном файле где они обьявленые.
2) Глобальные обьявления (global definition) – это обьявления
прорцедур,функций,данных котоые могут быть доступны из других обьектных
файлов
3) Внешние ссылки (extern references) – это обьявления которые глобальный
инаходяться в других обьектных файлах.

Для просмотра обявлений успользуеться програма nm.


Этап линкирования.


Линкирование это последний этап создания запускания файлов, он в включает в
a.out файл все ссылки обьявлений и их реализации , которые встречаються в
програме. Если например есть сылка а нет реализаци то линкировщик скажет
что не находит внешнего обявления и выдаст следюющее:
$ cc main.c
/bin/ld: Unsatisfied symbol:
my_func (code)


Работа с библиотеками


Очень полезным средсвом для хранения сылски реализаций внешних обьявлений
есть библиотеки. Стандартная библиотека libc которая содержит «основные»
функции для C,Fortran

Библиотеки называються libname.sfx
Name – название библиотеки, которая идентефецирует библиотеку
Sfx - если .а – архив, .sl – общедоступная библиотека.

Для того что б указать компилятору библиотеку то указываеться через опцию
–l. Например
--lm (подключает стандартну математическую библиотеку libm.a).
По умолчанию подключаються библиотеки libcl,libisamstub,libc.
По умолчанию библиотеки ищатся по путям /lib,/usr/lib,lib/libp. Можно
задать пути где искать:
1) Переменой коружения LPATH
2) Опция линкера -L


Также для каждой програмы входит обьектный файл /lib/crt0.o В этом файле
содержаться таочки входа в програму,простомтр аргументов и прочее.


Можна прочитать о фунциях которые есть в стандартных библиотеках исполюзую
man-page
Вызовы (функции) описываються следующим образом
Name(nL)
Name – название
N – 2-системные вызовы, 3-другие библиотеки
L – буква которая означает к которой библиотеке вызов относиться

Вот примеры:
|Група |Описание |
|(2) |Системные вызовы, низкоуровневый доступ до системных |
| |ресурсов. (работа с файлами,сигналы,управление |
| |процесами). Все вызовы содержаться в libc |
|(3C) |Стандартные С вызовы . Находяться в libc |
|(3S) |Стандартные вызова input/output (stdio(3S)) Находяться |
| |в libc |
|(3M) |Математические фунции. Для подключения используеться |
| |–lm или -lM |
|(3G) |Графические фунции |
|(3I) |Библиотека инструментариев |
|(3X) |Разные специализированые библиотеки |

|Сравнительные оценки Архивных и Общедоступных библиотек |
|Расширение |.a |.sl |
|Обьектный код |Делаеться с |Делаеться с |
| |обьектного кода |независимо-позиционог|
| | |о (PIC) обьектного |
| | |кода.Делаеться |
| | |компилятором с опцией|
| | |+z или +Z. |
|Создание |Составляеться |Составляеться PIC |
| |обьектные файлы ar |обьекты с ld командой|
| |командой | |
|Связывание адресса |Адресс определяется |Адресс определяеться |
|вызова |при линкировании |при выполнении |
| |програмы |програмы |
| a.out |Содержит в себе все |Содержит только |
| |вызовы и даные |таблицу где где |
| | |содержаться адреса |
| | |иназвание библитек |
|При запуске |Каждая програма |Все програмы |
| |содержит собственую |используют одну |
| |копию библиотеки |бублиотеку, которая в|
| | |памяти присутствующая|
| | |только один раз |


Опции компилятора cc

cс [option] files
. -Amode
. mode=c По умолчанию, стандартный компилятор С (по Керниган, Риттчи)
. mode=a ANSI C (ISO 9899:1990)
. mode=e Расшириное ANSI C

. -c Отменить фазу редактирования связей и создавать об'ектный файл даже
в случае программы, состоящей только из одного модуля.
. -p Сгенерировать дополнительные команды для подсчета числа обращений к
каждой функции. Кроме того, если имеет место фаза редактирования связей,
стандартная подпрограмма инициализации заменяется на такую, которая
автоматически вызывает функцию monitor(3C) и обеспечивает запись файла
mount.out при нормальном завершении об'ектной программы. Профиль
выполнения программы может быть затем получен при помощи команды prof(1).

. -Dname=def определяет макрос для препроцесорра (эквивалентно #define )
. -E посылает на стандартный поток вывода (по умолчанию на stderr)
. -g содержит дополнительную информацию для отладки
. -Idir Изменить алгоритм поиска включаемых (посредством директивы
#include) файлов, имена которых не начинаются с символа /, а именно:
сначала искать в указанном каталоге, а затем уже в каталогах стандартного
списка. Так, включаемые файлы, чьи имена заданы в двойных кавычках,
сначала ищутся в каталоге, содержащем файл, затем в каталогах, указанных
с помощью опции -I, а затем уже в каталогах стандартного списка.
Включаемые файлы, чьи имена заданы в угловых скобках, не ищутся в
каталоге, содержащем файл.
. -lname включает библиотеку
. -L dir dir= Дополнить каталогом список каталогов, которые содержат об
ектные библиотечные модули [для редактирования связей посредством ld
. -v расширынай информация о процессе компиляции
. -w не показывает предупреждений
. -Wx,arglist передает аргументы (опции) arglist для процеса. x
может принимать значения:

. d Driver
. p Preprocessor
. c Compiler
. a Assembler
. l Linker
. +z,+Z Опция создает PIC код
. -O Включить оптимизацию обьектного кода



Создание архивной библиотеки.


1) Для открытия библиотеки необходимо создать оььектные файлы. (в основном
каждая функция представляет свой обьектный файл)
2) Соеденить все обьекты в один архив командой ar с ключем r



Описание команды ar

ar [-][d][r][q][t][p][m][x][v][c][l][s] [позиционирующее_имя]
а_файл [имя ...]

Команда ar предоставляет средства обслуживания группы файлов, об единенных
в один архивный файл. Применяется главным образом для создания и изменения
библиотечных файлов, используемых редактором связей. Может применяться и
для других подобных целей. Магические цепочки и заголовки файлов состоят из
печатаемых ASCII-символов, так что если в состав архива входят только
печатаемые файлы, то и архив в целом окажется печатаемым.
При создании архива командой ar заголовки файлов строятся в формате, не
зависящем от конкретной машины. Формат и структура мобильного архива
подробно описаны в ar(4). Таблица имен архива (описанная там же)
используется редактором связей [ld(1)] для сокращения числа проходов по
библиотекам об ектных файлов. Команда ar создает и поддерживает таблицу
имен только при наличии в архиве хотя бы одного об ектного файла. Таблица
имен в случае ее создания помещается в начале архива в качестве файла с
особым именем. Ни ссылка на этот файл, ни доступ к нему для пользователя
невозможны. При создании или изменении архива командой ar(1) таблица имен
всякий раз перестраивается. Таблицу имен можно перестроить принудительно,
воспользовавшись описанной ниже опцией s.
В отличие от командных опций командный ключ составляет обязательную часть
командной строки ar. Ключ (которому может предшествовать символ -)
представляет собой один из символов набора drqtpmx. Аргументами же ключа
могут служить один или несколько символов из набора vuaibcls.
Позиционирующее_имя - это имя элемента архива, которое используется в
качестве указателя конкретного места архива, куда должны помещаться другие
файлы. А_файл - это имя архивного файла. Под именами подразумеваются имена
файлов, входящих в архив. Символам, образующим ключ, приписан следующий
смысл:
|d |Удалить указанные файлы из архива. |
|r |Заменить указанные файлы в архиве. Если в ключе наряду с r |
| |присутствует необязательный символ u, то замена будет произведена |
| |только для тех из указанных файлов, у которых дата последней |
| |модификации превышает соответствующую дату у одноименных файлов, |
| |хранящихся в архиве. Если ключ содержит признак позиционирования, |
| |т.е. один из необязательных символов abi, то в команде должен |
| |присутствовать аргумент позиционирующее_имя и в этом случае все |
| |новые файлы будут помещаться перед (b или i) или вслед за (a) |
| |файлом с таким именем. При отсутствии признака позиционирования |
| |новые файлы будут помещаться в конец архива. |
|q |Быстро поместить указанные файлы в конец архива. Использование |
| |символов позиционирования недопустимо. Проверка, имеются ли уже в |
| |архиве указанные файлы, командой не осуществляется. Данная |
| |возможность полезна только для того, чтобы избежать квадратичного |
| |роста временных затрат при наращивании больших архивов. Отказ от |
| |проверок может, напротив, повести к росту размеров архивного файла.|
|t |Вывести оглавление архива. Если имена не указаны, перечисляются все|
| |файлы архива; если имена указаны, выводятся только они. |
|p |Напечатать указанные файлы из архива. |
|m |Переместить указанные файлы в конец архива. Если ключ содержит |
| |признак позиционирования, то в команде должен присутствовать |
| |аргумент позиционирующее_имя, и тогда место, куда перемещаются |
| |файлы, будет определяться так же, как и для опции r. |
|x |Извлечь указанные файлы из архива и поместить в текущий каталог. |
| |Если имена не указаны, извлекаются все содержащиеся в архиве файлы.|
| |Операция не изменяет архивный файл. |


Аргументам ключа приписан следующий смысл:
|v |Вывести подробное, файл за файлом, описание процедуры создания |
| |нового архивного файла из старого архива и указанных в команде |
| |файлов-компонентов. При совместном использовании ключа t и |
| |аргумента v выводится подробная информация о каждом файле. При |
| |совместном использовании x и v по мере извлечения файлов будут |
| |выводиться их имена. |
|c |Подавить сообщение, выдаваемое обычно при создании а_файла. |
|l |Помещать временные файлы в локальный (текущий рабочий) каталог, а|
| |не в подразумеваемый временный каталог TMPDIR. |
|s |Принудительно регенерировать таблицу имен архива, даже если вызов|
| |не предусматривает модификации содержимого архива. Эта команда |
| |полезна при восстановлении таблицы имен после применения к архиву|
| |команды |



Открытие Библиотек Распределеного доступа


Первый шаг в создание общедоступной библиотеки должен создать объектные
файлы,
cодержащий переместимый код (PIC). Имеются два способа создать
PIC объектные файлы:


. Компилировать исходные файлы с + z или + Z опция компилятора, описанная
ниже.

. Записать программы на языке ассемблера, которые используют
соответствующее адресование режимы
.
+ z и + Z параметры вынуждают компилятор генерировать PIC объектные файлы.


Пример

Предположите, что Вы имеете некоторые функции C, сохраненные в length.c,
которые конвертируют(преобразовывают) между Английскими и Метрическими
модулями длины. Для компилиции эти подпрограммы и создайние PIC объектных
файлов с компилятором C, Вы можете бы использовать эту команду:

$ cc -Aa -c +z length.c
+z опция создает PIC.



Создание Общедоступной Библиотеки с ld


Чтобы создавать общедоступную библиотеку от одного или большее количество
PIC объектные файлы, используйте линкер ld, с -b опцией. По умолчанию, ld
назовет библиотеку а.out. Вы можете изменять название с -o опцией.
Например, предположите, что Вы имеете три исходных файла C, содержащие
подпрограммы, чтобы делать длину, объем, и массовые преобразования модуля.
Они названы length.c, volume.c, и mass.c, соответственно. Делать
общедоступную библиотеку от этих исходных файлов, сначала компилируют все
три файла, использующие +z опцию, затем комбинируют заканчивающиеся .o
файлы с ld. Показаны ниже команды, которые Вы использовали бы, чтобы
создать общедоступную библиотеку, названную libunits.sl:
$ cc -Aa -c + z length.c volume.c mass.c
length.c:
volume.c:
mass.c:c:
$ ld -b -o libunits.sl length.o volume.o mass.o
Как только библиотека создана, убедитесь наличия прав читения и
выполнения.Но можна выставить права такой командой
$ chmod +r+x libunits.sl

Например, если Вы имеете программу c названным convert.c, который
вызываетподпрограммы с libunits.sl, Вы могли бы компилироватьИ связь это с
командой cc:

$ cc -Aa convert.c libunits.sl

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


Модифицирование Общедоступной Библиотеки


Команда ld не может заменять или удалять объектные модули в общедоступной
библиотеке. Поэтому, чтобы модифицировать общедоступную библиотеку, Вы
должны повторно связать библиотеку со всеми объектными файлами, которые Вы
хотите, чтобы библиотека включила. Например, предположите, что Вы
устанавливаете некоторые подпрограммы в length.c (от предыдущего раздела)
которые давали неправильные результаты. Чтобы модифицировать libunits.sl
библиотеку, чтобы включить эти изменения(замены), Вы использовали бы этот
ряд команд:д:
$ cc -Aa -c + z length.c
$ ld -b -o libunits.sl length.o volume.o mass.o
Любые программы, которые используют эту библиотеку, будут теперь
использовать новые версии подпрограмм. То есть Вы не должны повторно
связать никакие программы, которые используют эту общедоступную библиотеку.
Это - то, потому что подпрограммы в библиотеке приложены к программе во
время выполнения.я.
Это - одно из преимуществ общедоступных библиотек по библиотекам архива:
если Вы изменяете(заменяете) библиотеку архивов, Вы должны повторно
связать любые программы, которые используют библиотеку архивов. С
общедоступными библиотеками, Вы должны только освежить библиотеку.



Применение make

Создание программы частенько начинается с маленького однофайлового проекта.
Проходит некоторое время и проект, как снежный ком, начинает обрастать
файлами, заголовками, подключаемыми библиотеками, требуемыми опциями
компиляции... и для его сборки становится уже недостаточным сказать "cc -o
file file.c". Когда же, через пару дней, однажды набранная магическая
строчка, содержащая все необходимые для сборки проекта параметры
компилятора, таинственно исчезает в недрах истории вашего командного
интерпретатора, рождается естественное желание увековечить свои знания в
виде, к примеру, шелл скрипта. Затем, возможно, захочется сделать этот
скрипт управляемым параметрами, чтобы его можно было использовать для
разных целей... Однако, чудо юникса состоит в том, что если вам что-то
понадобилось, значит кто-нибудь это уже сделал, и пришло время вспомнить о
существовании команды make.

Рассмотрим несложную программу на C. Пусть программа prog состоит из пары
файлов кода main.c и supp.c и используемого в каждом из них файла
заголовков defs.h. Соответственно, для создания prog необходимо из пар
(main.c defs.h) и (supp.c defs.h) создать объектные файлы main.o и supp.o,
а затем слинковать их в prog. При сборке вручную, выйдет что-то вроде:

cc -c main.c defs.h
cc -c supp.c defs.h
cc -o prog main.o supp.o

Если мы в последствии изменим defs.h, нам понадобится полная
перекомпиляция, а если изменим supp.c, то повторную компиляцию main.о можно
и не выполнять. Казалось бы, если для каждого файла, который мы должны
получить в процессе компиляции указать, на основе каких файлов и с помощью
какой команды он создается, то пригодилась бы программа, которая во-первых,
собирает из этой информации правильную последовательность команд для
получения требуемых результирующих файлов и, во-вторых, инициирует создание
требуемого файла только в случае, если такого файла не существует, или он
старше, чем файлы от которых он зависит. Это именно то, что делает команда
make! Всю информацию о проекте make черпает из файла Makefile, который
обычно находится в том же каталоге, что и исходные файлы проекта.

Простейший Makefile состоит из синтаксических конструкций всего двух типов:
целей и макроопределений.

Цель в Makefile - это файл(ы), построение которого предполагается в
процессе компиляции проекта. Описание цели состоит из трех частей: имени
цели, списка зависимостей и списка команд интерпретатора sh, требуемых для
построения цели. Имя цели - непустой список файлов, которые предполагается
создать. Список зависимостей - список файлов, из которых строится цель. Имя
цели и список зависимостей составляют заголовок цели, записываются в одну
строку и разделяются двоеточием. Список команд записывается со следующей
строки, причем все команды начинаются с обязательного символа табуляции.
Возможна многострочная запись заголовка или команд через применение символа
"" для экранирования конца строки. При вызове команды make, если ее
аргументом явно не указана цель, будет обрабатываться первая найденная в
Makefile цель, имя которой не начинается с символа ".". Примером для
простого Makefile может послужить уже упоминавшаяся программа prog:

prog: main.o supp.o
cc -o prog main.o supp.o
main.o supp.o: defs.h

В прведенном примере можно заметить ряд особенностей: в имени второй цели
указаны два файла и для этой же цели не указана команда компиляции, кроме
того, нигде явно не указана зависимость объектных файлов от "*.c"-файлов.
Дело в том, что команда make имеет предопределенные правила для получения
файлов с определенными суффиксами. Так, для цели - объектного файла
(суффикс ".o") при обнаружении соответствующего файла с суффиксом ".c",
будет вызван компилятор "сс -с" с указанием в параметрах этого ".c"-файла и
всех файлов - зависимостей. Более того, в этом случае явно не указанные
".c"-файлы make самостоятельно внесет в список зависимостей и будет
реагировать их изменение так же, как и для явно указанных зависимостей.
Впрочем, ничто не мешает указать для данной цели альтернативную команду
компиляции.

Вы вероятно заметили, что в приведенном Makefile одни и те же объектные
файлы перечисляются несколько раз. А что, если к ним добавится еще один?
Для упрощения таких ситуаций make поддерживает макроопределения.

Макроопределение имеет вид "ПЕРЕМЕННАЯ = ЗНАЧЕНИЕ". ЗНАЧЕНИЕ может являться
произвольной последовательностью символов, включая пробелы и обращения к
значениям уже определенных переменных. В дальнейшем, в любом месте
Makefile, где встретится обращение к переменной-макроопределению, вместо
нее будет подставлено ее текущее значение. Обращение к значению переменной
в любом месте Makefile выглядит как $(ПЕРЕМЕННАЯ) (скобки обязательны, если
имя переменной длиннее одного символа). Значение еще не определенных
переменных - пустая строка. С учетом сказанного, можно преобразовать наш
Makefile:

OBJS = main.o supp.o
prog: $(OBJS)
cc -o prog $(OBJS)
$(OBJS): defs.h

Теперь предположим, что к проекту добавился второй заголовочный файл
supp.h, который включается только в supp.c. Тогда Makefile увеличится еще
на одну строчку:

supp.o: supp.h

Таким образом, один целевой файла может указываться в нескольких целях. При
этом полный список зависимостей для файла будет составлен из списков
зависимостей всех целей, в которых он участвует, однако создание файла
будет производиться только один раз.

В нашем примере мы группировали цели по принципу общих зависимостей, однако
существует и альтернативный способ - группировать зависимости по одной
цели. В этом случае Makefile будет выглядеть немного иначе, однако его суть
не изменится.

OBJS = main.o supp.o
prog: $(OBJS)
cc -o prog $(OBJS)
main.o: defs.h
supp.o: defs.h supp.h

Обычно Makefile пишется так, чтобы простой запуск make приводил к
компиляции проекта, однако, помимо компиляции, Makefile может
использоваться и для выполнения других вспомогательных действий, напрямую
не связанных с созданием каких-либо файлов. К таким действиям относится
очистка проекта от всех результатов компиляции, или вызов процедуры
инсталляции проекта в системе. Для выполнения подобных действий в Makefile
могут быть указаны дополнительные цели, обращение к которым будет
осуществляться указанием их имени аргументом вызова make (например, "make
install"). Подобные вспомогательные цели носят название фальшивых, что
связанно с отсутствием в проекте файлов, соответствующих их именам.
Фальшивая цель может содержать список зависимостей и должна содержать
список команд для исполнения. Поскольку фальшивая цель не имеет
соответствующего файла в проекте, при каждом обращении к ней make будет
пытаться ее построить. Однако, возможно возникновение конфликтной ситуации,
когда в каталоге проекта окажется файл с именем, соответствующим имени
фальшивой цели. Если для данного имени не определены файловые зависимости,
он будет всегда считаться актуальным (up to date) и цель выполняться не
будет. Для предотвращения таких ситуаций make поддерживает "встроенную"
переменную ".PHONY", которой можно присвоить список имен целей, которые
всегда должны считаться фальшивыми.

Теперь можно привести пример полного Makefile, пригодного для работы с
проектом prog и принять во внимание некоторые часто применяемые приемы:

OBJS = main.o supp.o
BINS = prog
PREFIX = /usr/local

INSTALL = install
INSOPTS = -s -m 755 -o 0 -g 0
CC = gcc
.PHONY = all clean install

all: $(BINS)

prog: $(OBJS)
$(CC) -o prog $(OBJS)

main.o: defs.h

supp.o: defs.h supp.h

clean:
rm -f $(BINS)
rm -f $(OBJS)
rm -f *~

install: all
for $i in $(BINS) ; do
$(INSTALL) $(INSOPTS) $$i $(PREFIX)/bin ;
done

Итак, у нас появились три фальшивых цели: all, clean и install. Цель all
обычно используется как псевдоним для сборки сложного проекта, содержащего
несколько результирующих файлов (исполняемых, разделяемых библиотек,
страниц документации и т.п.). Цель clean используется для полной очистки
каталога проекта от результатов компиляции и "мусора" - резервных файлов,
создаваемых текстовыми редакторами (они обычно заканчиваются символом "~").
Цель install используется для инсталляции проекта в операционной системе
(приведенный пример расчитан на установку только исполняемых файлов).
Следует отметить повсеместное использование макроопределений - помимо
всего, этот прием повышает читабельность. Обратите также внимание на
определение переменной $(CC) - это встроенная переменная make и она неявно
"сработает" и при компиляции объектных файлов.
Внутренние макросы

Мake поддерживает пять внутренних макросов, полезных при написании правил
построения целевых файлов:
$*
Этот макрос является именем файла без расширения из текущей зависимости;
вычисляется только для подразумеваемых правил (см. Суффиксы).
$@
Этот макрос заменяется на полное имя целевого файла; вычисляется только
для явно заданных зависимостей.
$> file Append commands to file.
>@ file Record-all debugger commands &
output to file.
>>@ file Append all debugger commands &
output to file.
">>" is equivalent to ">" for the next four commands.
> Show status of current recording
file.
>@ Show status of current record-all
file.
>(t | f | c) Turn recording on (t), or off (f),
or close the recording file (c).
>@(t | f | c) Turn record-all on (t), or off (f),
or close the record-all file (c).

Misc:
ss file Save (breakpoint, macro, assertion)
state.
tc Toggle case sensitivity in
searches.
Repeat previous command.
~ Repeat previous command.
! [command-line] Execute shell (with or without
commands).
q Quit debugger.
$addr Unary operator, address of object.
$sizeof Unary operator, size of object.
$in Unary boolean operator, execution
in procedure.
# [text] A comment.
I Print debugger status.
M [(t | c) [expr [; expr ...]]] Print or set (text or core) maps.
tM Toggle between default and
modifiable core maps.


VARIABLES

var Search current procedure
and globals.
class::var Search class for variable.
[[class]::]proc:[class::]var Search procedure for variable.
[[class]::]proc:depth:[class::]var Search procedure at depth on stack.
:var or ::var Search for global variable
only.
. Shorthand for last thing you
looked at.
$var Define or use special
variable.
$result Return value of last cmd line
procedure call.
$signal Current child process signal
n

Новинки рефератов ::

Реферат: Педагогика Джона Локка как педагогика переходного периода (Педагогика)


Реферат: Семья как социальный институт (Социология)


Реферат: Основы политологии (Политология)


Реферат: Право международных организаций (Международное публичное право)


Реферат: Достижение конкурентоспособности продукции предприятия (Менеджмент)


Реферат: Лидерство (Социология)


Реферат: Оповещение о чрезвычайных ситуациях. Сигналы оповещения ГО и действие населения по ним (Социология)


Реферат: Жакет прямого силуэта (Технология)


Реферат: Искусство эллинской культуры (Культурология)


Реферат: Протоколы и стандарты объектно-ориентированного программирования (Программирование)


Реферат: Платонов (Литература : русская)


Реферат: Символы рыб, морских животных и обитателей воды: их значение (семиотика) (Культурология)


Реферат: Заметки социолога (Социология)


Реферат: Динамическое распределение памяти (Программирование)


Реферат: Внешнеполитические предпосылки воссоединения Западной Беларуси в СССР (История)


Реферат: Авторская позиция в романе И. Бабеля "Конармия" и способы ее выражения (Литература : русская)


Реферат: Болезни цивилизации (Биология)


Реферат: Аппаратные средства ПК (Компьютеры)


Реферат: Конспект урока по биологии - белки (Педагогика)


Реферат: Синтетические возможности реакции Вильсмейера-Хаака-Арнольда (Химия)



Copyright © GeoRUS, Геологические сайты альтруист