Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные системы (часть 1)

.pdf
Скачиваний:
22
Добавлен:
24.03.2015
Размер:
219.83 Кб
Скачать

echo, cat, wc, less, grep, iconv, sed, awk, vi (простейшая работа с текстом)

tar, cpio, gzip (работа с архивами)

chmod, chown, chgrp (работа с атрибутами файлов и каталогов)

kill, ps (работа с задачами)

mount, umount (монтирование и размонтирование файловых систем)

nice, time (контроль времени)

passwd, useradd, usermod, userdel, groupadd, groupmod, groupdel (администрирование)

write, talk, mail, telnet/ssh, ftp, lynx/lyncs (доступ к удаленным компьютерам)

Язык оболочки (shell) среды позволяет использовать переменные, циклы, ветвления, арифметику, специальные символы *?[]^'"`\#$ и др. возможности. Среди спецсимволов выделяют метасимволы:

* -- любое число любых символов, ? -- любой одиночный символ,

[] -- одиночный символ из перечисленных в скобках (знак - можно использовать для образования диапазона, например, [0-9] -- десятичная цифра, [A-Z] -- английская заглавная буква), если после [ писать ^, то получится одиночный символ не из перечисления в скобках, например, [^14] -- не 1 и не 4.

Стандартные потоки ввода-вывода

*

оболочка Си Си++

ввода

0

 

stdin cin

вывода

1

 

stdout cout

вывода ошибок

2

stderr cerr, clog

Переадресация потоков производится операциями >, >>, <, <<.

При своем завершении программа возвращает ОС число -- код возврата. Для программ на Си/Си++ -- это значение функции main(). Нулевой код возврата означает, что программа завершилась успешно, ненулевой -- программа завершилась аварийно. Ненулевой код возврата -- это информация о характере произошедшей ошибки.

Программы могут вызываться последовательно безусловно, через точку с запятой, или последоватедльно условно двумя способами: 1) через && -- организуется

конвейер, каждая следующая программа запускается только при успехе предыдущей; 2) через || -- организуется поиск успешного варианта из множества предложенных, каждая следующая программа запускается только при неуспехе

предыдущей. Если при вызове программы использовать команду, заканчивающуюся на &, то программа будет вызвана в фоновом режиме, параллельно. При вызове программ, разделенных |, организуется трубопровод -- вывод каждой предшествующей программы становится вводом для следующей. Все программы в трубопроводе работают одновременно, параллельно. Вызовы программ можно группировать скобками.

Пример

@echo 'this is

@a simple text

@which consists

@of five lines

@END' >log

@cat log #shows content of log

@echo 'wc <<END' >log2

@cat log >>log2

@cat log2 #shows content of log2

@chmod 755 log2 #sets protection attributes as rwxr-xr-x

@log2 #executes log2: counts words, lines & symbols of first 4 lines of log

@ls /bin #shows content of /bin directory

@ls|grep log #shows all filenames contained string log in current directory

@rm log log2

@echo 'main(){return 1;}' >FALSE.c

@echo 'main(){return 0;}' >TRUE.c

@gcc -o FALSE FALSE.c; gcc -o TRUE TRUE.c

@FALSE; TRUE; echo ok. #ok.

@TRUE && echo ok1. #ok1.

@FALSE && echo ok2.

@TRUE || echo ok3.

@FALSE || echo ok4. #ok4.

@`echo FALSE` && echo ok5.

@rm *.c

@echo echo echo of echo >"it's echo"

@chmod 711 it\'s\ echo #rwx--x--x

@it\'s\ echo #echo of echo

@`it\'s\ echo` #of echo

@rm it*echo

@ls -l /usr/bin|less #use Up & Down arrows, q for quit

@ls /usr/bin|wc #counts quantity of files in /usr/bin

@ln /bin/ls dir #establishes hard link

@./dir #the same as ls

@ln -s /bin/ls dir2 #establishes symbolic link

@./dir2 #the same as ls

@rm dir? FALSE TRUE #can't delete read only hard link dir

@rm -f dir #forces delete operation

@ps

@sleep 10000& #creates task

@ps|grep sleep

@#kill <PID of sleep> #deletes task

В системе обычно присутствуют утилиты true и false с функциями приведённых программ

TRUE и FALSE.

Специальные файлы Linux

Будем перечислять их по кратким именам, даваемых ls -l l - link - Символические соединители (ссылки)

b - block - Блочные устройства, например, /dev/sda - это, как правило, диски, дисковые разделы и т.п. Предназначены для блочного ввода и вывода.

с - character - Символьные устройства, например, /dev/random, /dev/null, /dev/zero. Предназначены для посивольного ввода и вывода.

d - directory - Каталоги

p - pipe - Именованные трубопроводы. Можно использовать как очередь для обмена данными между процессами. Рассмотрим пример. Наберём в первом терминале

mkfifo /tmp/fifo #создание именованного трубопровода echo Hello >/tmp/fifo

Наберём теперь во втором терминале cat /tmp/fifo

s - socket - Доменные сокеты (гнезда) Unix. Аналогичны сетевым сокетам, но используются только локально. Сокет создаётся процессом и не может существовать отдельно от этого процесса. Сокету-серверу привязывается порт, к которому могут обращаться сокеты-клиенты. Обычно в системе есть сокет /dev/log. Список всех сокетов можно получить по команде netstat.

Структура файловой системы FAT. DOS

Знаком каталога в DOS является обратная наклонная черта (backslash). Заглавные и строчные буквы не различаются. В DOS дерево каталогов определяется установленными программами и пользователем.

Дисковое пространство систем FAT выделяется и освобождается минимальными единицами, кластерами (cluster). Размер кластера - это число всегда кратное 512 байтам, т.е. размеру стандартного сектора на диске. Главная характеристика системы FAT - максимальное количество кластеров. В FAT-12 это число равно приблизительно 2^12=4096, в FAT-16 - 2^16=65536, в FAT-32 - 2^32=4294967296. Очевидно, что количество файлов и каталогов не может быть большим количества кластеров. Чем больше размер кластера, тем менее экономно расходуется дисковая память, например, для диска емкостью 1.5GB с системой FAT-16 минимально возможный размер кластера - 32KB, т.е. даже для файла длиной 100 байт будет выделяться 32KB на диске. FAT-12 используется для дискет и жестких дисков, объемом до 10MB,

FAT-32 - для дисков, объемом более 1GB, FAT-16 можно использовать для дисков, объемом до 2GB. Объём файла в FAT-32 ограничен 4GB.

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

с кластерами осуществляется через таблицу размещения файлов (FAT - File Allocation Table). Каждому кластеру соответствует число --- элемент этой таблицы. В FAT-12 число 12-разрядное, в FAT-16 --- 16-разрядное, в FAT-32

--- 32-разрядное. Если это число равно 0, то соответствующий кластер свободен. Число от 1 до максимального минус 15 --- это ссылка на следующий кластер файла или каталога. Максимальное число минус 8 означает, что кластер нельзя использовать, --- так обычно отмечают кластеры, содержащие физически дефектные сектора. Числа большие последнего числа --- это последний кластер файла или каталога.

Каталог --- это файл, состоящий из записей, каждая из которых соответствует принадлежащему ему файлу или подкаталогу, и состоит из стандартного набора полей-характеристик для файлов и каталогов.

Исключением является только корневой каталог --- он не является файлом, а организуется специальнам образом. Каждый диск имеет свой корневой каталог.

Основные характеристики файла в FAT:

-имя файла (до 8 символов на собственно имя и до 3 на расширение --- это традиционное имя, в добавок к нему, начиная с Microsoft Windows 95, можно использовать длинное имя, длиной до 255 символов Unicode);

-время последнего изменения файла;

-время последнего обращения к файлу (начиная с Windows 95, опционально);

-атрибуты:

Read Only

--- только для чтения ---

файл нельзя изменять или удалить;

System ---

системный ---

файл относится к операционной системе;

Hidden ---

скрытый, спрятанный ---

не показывать файл в списке файлов;

Archive ---

архивный ---

устанавливается при изменении файла,

сбрасывается при создании архивной копии файла;

Directory ---

каталог;

 

 

Volume Label --- метка диска или раздела --- ``файл'' длины 0, он предназначен только для именования диска или раздела на нем, должен быть расположен в корневом каталоге;

-размер файла в байтах;

-ссылка на первый кластер файла.

Время в FAT записывается месяцем, числом месяца, номером года,

начиная с 1980 (до 2107), часом, номером минуты и пары секунд.

В именах файлов и каталогов не допустимо использование ряда специальных символов (*\ /:+?>). Ряд имен, например, prn (принтер) или nul (пустое устройство), являются зарезервированными для именования устройств.

Общая организация данных на диске

BOOT - FAT - COPY OF - ROOT - FREE SPACE

@ FAT (opt) DIRECTORY

Простейшие утилиты DOS, опция /?

help (информация по командам, форматам файлов и т.п. --- только в MS-DOS, в DOS других фирм может называться по-другому или отсутствовать)

date, mem (справки по ресурсам)

copy, move, del, dir, cd, mkdir, rmdir (работа с объектами файловой системы)

echo, type, more (простейшая работа с текстом)

attrib (работа с атрибутами файлов)

Язык оболочки (COMMAND.COM, CMD.EXE), специальные символы и метасимволы

:><\/.

*?

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

Потоки ввода-вывода (такие же как в Linux)

переадресация потоков: >, >>, <

Вызов программ

код возврата (результат main() для программ на C/C++)

одиночный, через трубопровод (|)

Пример (файл должен иметь расширение BAT)

@echo Hello DOS!

@set VAR=TEST

@echo It's a %VAR%.

@if _%VAR%_==_TEST_ goto L1

@echo It's impossible to see.

@:L1

@echo ok

@rem goto L1

Скриптовые языки

Главная особенность этих языков (scripting language), называемых также языками сценариев, в том, что тексты программ на них (скрипты, сценарии) используются, как правило, непосредственно, без этапа компиляции, т.е. это интерпретирующиеся языки. Вторая особенность

скриптовых языков, отличающая их от таких языков как классический бэйсик, ---

это их ориентированность на интеграцию всевозможных программных средств, а также часто их легкая встраиваимость в другие системы программирования. Скриптовые языки широко используются в Internet и как

языки командных файлов. Наиболее широко используются следующие универсальные языки скриптов: Ruby, Tcl, Perl, JavaScript, Python, PHP, Haskell, VBScript.

В среде Linux широко используется язык оболочки Bash, в DOS --- язык BATCH-файлов. Все языки скриптов предназначены для быстрой разработки ПО.

Первым скриптовым языком можно считать язык JCL (Job Control Language) фирмы IBM для систем OS/360 начала 1960-х.

Операционная оболочка Bash (Bourne Again Shell) представляет собой итог более 20-летнего развития оболочек Unix. Bash мобильна и существует также для ОС Microsoft DOS и Windows. Применяется в основном для интерактивного текстового взаимодействия ОС с пользователем и написания командных файлов.

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

Один из популярных в Internet для создания CGI-скриптов (Common Gate Interface) язык перл (Perl --- Practical Extraction and Report Language)

разрабатывается Лэрри Уоллом (Larry Wall) с конца 1980-х. Perl объединил в себе многие средства языка си и популярных в Unix программ для обработки текстов: bash, sed, awk. Недостатки перл: программы трудны для понимания (у

подпрограмм, например, нет явных формальных параметров), наличие избыточных точки-с-запятой и фигурных скобок, путанность терминологии (указатели называют ссылками), малопригоден для встраивания в другие приложения. Одна из лучших среди прочих ЯП поддержка регулярных выражений.

@sub fact {

@my $n = shift;

@if ($n < 2) {return 1;}

@return $n*fact($n-1);

@}

Язык Tcl (Tools Command Language, произносится tickle) создан в конце 1980-х Джоном Остерхаутом (John Ousterhout), как встраиваемый язык для интерактивных средств. Фактически является расширенным языком оболочки. Tcl во многом похож на язык оболочек Unix. В начале

1990-х к Tcl был добавлен пакет Tk (Toolkit) для быстрой разработки графических интерфейсов. Tk не превязан жестко к Tcl и используется, в

частности, с перл (Perl/Tk), питоном, рубином. Tcl используется для разработки CGI-скриптов, а Tk --- это наипростейшее средство для создания графических приложений для всевозможных вариантов Unix. Tcl/Tk можно также использовать для приложений стороны клиента в WWW (World Wide Web), однако, в этом качестве он поддерживается значительно менее, чем яваскрипт. Сильными сторонами Tcl являются хорошая поддержка ситуационного подхода в программировании и простота основ. Слабой стороной --- трудность разработки больших программ.

@proc fact n {

@if $n<2 {return 1}

@expr $n*[fact [expr $n - 1]]

@}

Яваскрипт (JavaScript) создан в середине 1990-х Netscape Corp. для WWW-браузеров, как язык встраиваемый в HTML-документы. Этот язык --- фактический стандарт для программ стороны клиента в WWW. Он только незначительно связан с языком

ява (Java) фирмы Sun Microsystems. На основе яваскрипт создан стандарт ECMAScript (European Computer Manufacturers Association). Выделяется существованием нескольких плохосовместимых разновидностей, что требует поддержки каждой из них в wwwстраницах, ---

стандарт DOM направлен на устранение этих несовместимостей.

@function fact(n) {

@if (n < 2)

@return 1;

@return n*fact(n-1);

@}

Язык питон (Python), созданный в начале 1990-х Гвидо ван Россумом (Guido van Rossum) в Штихтингском Математическом Центре (Stichting Mathematisch Centrum) в Амстердаме для преодоления разрыва между программированием на языке оболочек и си, является объектно-ориентированным, простым для изучения, поддерживающим высокоуровневые типы данных, мобильным, легко расширяемым и встраиваемым языком. Используется для написания CGI-скриптов, программ с графическим интерфейсом (Python/Tk, Python/wxWidgets), СУБД. Выделяется требованием к структурной записи операторов, поддержкой множественного наследования и функционального программирования. Недостатки: громоздкость синтаксиса для работы с данными, сложности с автоматическим освобождением динамической памяти ("уборщиком мусора") --- введение "слабых ссылок" (weak references).

@def fact(n):

@if n<2: return 1

@return n*fact(n-1)

VBScript (VBS) фирмы Microsoft является вариантом (наряду с VBA и VB.NET) языка Visual Basic, популярным с начала 1990-х, и предоставляет

простейший путь для создания графических приложений для Microsoft Windows. Его недостатки: немобильность, отсутствие поддержки многих средств программирования, трудность встраивания в другие программные системы. Скрипты на VBScript можно встраивать в HTML-файлы --- они исполняются, подобно яваскрипт, на компьютере пользователя. Их также можно использовать

как командные файлы.

@function fact(n)

@if n<2 then

@fact=1

@else

@fact=n*fact(n-1)

@end if

@end function

Язык ПХП (PHP, Personal Home Pages или PHP: Hypertext Preprocessor, вторая половина 1990-х) используется в основном в Internet как встраеваемый, подобно яваскрипт,

в HTML язык, который в отличие от яваскрипт выполняется

на сервере. Выделяется отсутствием поддержки обычных массивов (все ---

ассоциативные), наличием двух явных присваиваний, по ссылке и по значению, си-синтаксисом операторов.

Недостатки: необходимость точки-с-запятой; необходимость знака доллара перед переменными.

@function fact ($n) {

@if ($n < 2) return 1;

@return $n*fact($n - 1);

@}

Рубин (Ruby) разрабатывается с 1993 Юкихиро Мацумото (Matz). Стал основой революционной среды web-разработки Ruby on Rails (Рубин на рельцах). Отличается хорошей поддержкой ООП, хотя и без множественного наследования,

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

@def fact(n)

@if n<2

@1

@else

@n*fact(n-1)

@end

@end

Язык Хаскелл (Haskell) считается наиболее ``чистым'' функциональным

языком. Отличается, наряду с VBS, частичной поддержкой работы с типами, а также наиболее эффектным синтаксисом определения функций. В нем реализованы так называемые "ленивые вычисления", т.е. вычисления в этом языке откладываются до последнего возможного момента, что позволяет, в частности, работать с

псевдобесконечными структурами. Пространства имен типов и переменных разделены.

@fact 0 = 1

@fact n = n*fact(n-1)

Луа (Lua) --- самый маленький (если сравнивать размеры описаний грамматик) язык сценариев. Основной тип данных -- таблицы. Отличается тесной интеграцией с Си и ориентированностью на встраивания в приложения. Нет поразрядных операций.

@function fact(n)

@if n < 2 then

@return 1

@else

@return n*fact(n - 1)

@end

@end

Регулярные выражения

Библиотеки для работы с регулярными выражениями используются при программировании на Си. Непосредственно реализованы в ЯП Perl, Python, JavaScript, Tcl/Tk, Awk (Aho+Weinberger+Kernighan), а также в утилитах обработки текста sed (Stream Editor) и grep (Great Regular Expression) и

в некоторых других программных средствах.

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

Различают базовые регулярные выражения и расширенные. Расширения в разных средствах различаются по объему.

Фундаментальной строительной единицей регулярных выражений является регулярное выражение, соответствующее одиночному символу. Буквы, цифры и большинство прочих символов соответствуют сами себе. Если же символ имеет специальное значение, то предварение его обратной косой чертой отменит это значение. Множество символов, заключенных в квадратные скобки, соответствует любому символу из этого множества, как и в bash. Если перед множеством поставить знак ^, то это выражение будет соответствовать одному любому символу не из этого множества. Любой одиночный символ в отличие от оболочки обозначается знаком точка. Если обозначить за r регулярное

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

выражение значение

r1r2

r1 затем r2

r1|r2

либо r1, либо r2

r*

0 или более раз r

r+

1 или более раз r

r?

0 или 1 раз r

r{n}

n раз r

r{n,}

n или более раз r

r{,m}

m или менее раз r

r{n,m}

от n до m раз r

^

начало строки

$конец строки

(r)группировка и пометка для ссылки

\d

ссылка назад на d-ое помеченное выражение

В базовых регулярных выражениях символы |+?{}() нужно предварять знаком \.

Ссылки, в общем случае, могут требовать экспоненциального времени обработки. Выражения с фигурными скобками могут потребовать много памяти.

(П) [A-Z][a-z]* --- слова из английских букв, начинающиеся с заглавной буквы [A-Za-z_][A-Za-z_0-9] --- идентификатор Си, Паскаля

[0-9]*\.[0-9]+ --- числа с плавающей десятичной точкой [^abc]*a[^abc]*b[^abc]*c[^abc]* --- строки, содержащие в

последовательном порядке буквы a, b, c

.*(zz|s{2})+.* --- строки, содержащие двойную z или s (.)\1 --- сдвоенный символ

Обычно регулярному выражению сопоставляется самая длинная подходящяя строка. Это называется жадной квантификацией. В некоторых расширениях можно использовать знак ? для указания на ленивость (нежадность) квантификации. Например, s* в строке sssss будут соответствовать все символы, а s+?

только первая s.

Программа grep

Она является представителем большого семейства программ-фильтров. Через такие фильтры пропускаются потоки данных, выделяя из них данные только с нужными свойствами. Программу grep часто используют для поиска файлов,

содержащих соответствуюшие заданному регулярному выражению (шаблону) строки.

(П) Для поиска в файле fortest строк, содержащих слово computer, нужно ввести команду grep computer fortest.

В общем случае формат вызова ---

grep [<опции>] <регулярное выражение> [<файлы для поиска>]. Среди множества опций особенно важны:

-E переключает grep на работу с расширенными регулярными выражениями (по умолчанию

используются базовые);

-f <файл> взять шаблон из файла;

-i игнорировать различие между строчными и прописными буквами;

-v инвертирует условие поиска, например, grep -v computer fortest означает найти все строки файла fortest, не содержащие слова computer.

-r искать не только в заданных каталогах, но и в их подкаталогах

-n показыват номера строк