
Операционные системы (часть 1)
.pdfecho, 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 показыват номера строк