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

Забродин УНИХ основы командного интерфейса 2010

.pdf
Скачиваний:
159
Добавлен:
16.08.2013
Размер:
1.33 Mб
Скачать

Если команда в конвейере не меняет или сокращает передаваемую информацию, то такие команды называются командами-

фильтрами.

Пример:

$ ls -l| grep ‘Мar’|wc -l

- вывод на экран числа строк текущего каталога, содержащих подстроку "Мar" (подсчитывается число файлов, модифицированных в марте).

Пример: $who>fil $sort<fil

или иначе: $who|sort

$

Конвейер удобно использовать для просмотра вывода команды, когда информация занимает больше одного экран:

$cat filmax|more

Пример использования команд-фильтров. Здесь конвейер выбирает строки из одного файла, упорядочивает их и перенаправляет результат в другой файл:

$cat f1|grep –n’result’ *|sort|cat>f2

Если при решении задач возникает потребность отображения результатов одновременно на нескольких внешних устройствах, то это обеспечивает команда-тройник:

tee [-ключи] файл — дублирование стандартного вывода (экран) в указанный файл.

Ключи:

-iигнорирование прерываний, что обеспечивает непрерывность вывода;

-a — содержимое ввода добавляется к существующему файлу в его конец (накопление данных); если указанный файл не существует, то создается новый с указанным именем и в него записывается результат работы команды tee.

61

Пример:

$ ls -l | tee -a fil.res

Конвейер обеспечивает вывод содержимого каталога на экран и добавляет эти данные к содержимому fil.res.

Пример:

$ ls -l | tee fil | wc -l 20

$сat fil

# содержимое файла можно просмотреть на экране.

Полный листинг каталога выводится в файл fil, а число строк в каталоге — на экран (на стандартный вывод). Однако вывода каталога на экран в данном случае не будет, так как выходной поток команды ls после команды tee перенаправляется опять в конвейер (для команды wc).

Пример:

$find . -type d|tee fil|wc -l — подсчет числа подкаталогов в текущем каталоге и вывод их полных маршрутных имен в файл fil.

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

Еще одна команда-фильтр вырезает и объединяет указанные

элементы строк символов входного потока и выводит результат на экран:

$cut -k [имя_входного_файла]

- если имя входного файла не указано, то входной поток поступает со стандартного устройства ввода (клавиатура) или из программного канала.

Некоторые ключи (эти два ключа используются совместно):

-f<список_номеров_полей_в_строке_файла> — в выходной поток передаются только указанные поля, разделенные символьными разделителями;

-d<вид_разделителя_полей_в_строке_файла> — примеры разделителей: ‘;’ или ‘:’ или ‘ ’ , по умолчанию — табуляция.

62

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

-b<число_байтов_или_выражение_для_подсчета числа>

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

-c<число_символов_или_выражение> — посимвольное выре-

зание полей из строк входного потока и направление их в выходной поток.

Несколько не связанных между собой примеров использования команды:

$сut -f1 -d’:’ /etc/passwd — формируется и выводится на экран список зарегистрированных пользователей;

$who|cut -f1 -d’:’ |tee filuser — то же и дополнительный вывод в файл

$cat /etc/passwd|cut -d’:’ -f1;

$ls -l|cut -b-15 — вырезаются байты с первого по пятнадцатый, и выводит на экран только первые 15 байтов каждой строки листинга;

$ls -l|cut -с11-25 — диапазон номеров символов в строке и выводит на экран с 11 по 25 символ каждой строки листинга;

$ls -l|cut -с25- |cat >>fil — вырезаются символы от 25 до конца строки, и выводит на экран только 25-й символ каждой строки.

Значение числа элементов может быть вычислено, например: -c$a — значение задается переменной или

-с`expr ………..` — может быть использовано арифметическое или логическое выражение (см. ниже) и т.п.

Вопросы для самоконтроля

1.Понятие программного канала ОС UNIX.

2.Конвейеры. Какие команды могут быть включены в конвейер?

3.Какое практическое назначение конвейеров?

4.Команды-фильтры. Особенности работы. Примеры.

63

5.ПРОЦЕССЫ В UNIX

5.1.УПРАВЛЕНИЕ ПРОЦЕССАМИ

UNIX — многопользовательская многозадачная операционная система. Концепция процесса является базовой для архитектуры ОС. Процесс строится для каждой прикладной (например, shпроцедуры) и системной задачи (например, утилиты) с помощью системного вызова fork. Является единицей вычислительной работы и потребления ресурсов. В процессе жизни в системе процесс непосредственно управляется специальными системными вызовами, которые обеспечивают его построение — передачу управления — завершение:

fork - exec - exit — совокупность этих переключений состояний процесса определяет время существования процесса.

В общем случае активный процесс (выполняемая задача) может находиться в одном из шести состояний (в Linux):

ожидание процессора в очереди;

выполнение на процессоре в течение выделенного кванта времени;

ожидание освобождения ресурса (например – устройства);

приостановлен специальным сигналом;

завершился, но его дескриптор еще в оперативной памяти ядра ОС;

процесс свопирован на внешнюю память.

В ОП в активном состоянии находится несколько процессов — до 30000. Каждому процессу выделяется виртуальная память практически без ограничений (за счет страничной организации).

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

64

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

-программы-сокеты — для обмена данными;

-программные каналы для обмена данными между утилитами (см. выше);

-асинхронные сигналы – ключевые слова, передаваемые от одного процесса к другому, например, для завершения выполнения процесса или для получения информации о свершении некоторых событий в системе (сигнал от таймера, ошибка при передаче данных на устройство, попытка выполнения несуществующей команды и пр.);

-семафоры – синхронизация выполнения процессов посредством установки значений бит-"флагов" специальных системных переменных;

-совместно используемая общая область физической памяти. Перечисленные механизмы использует как сама ОС (write,mail

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

Роассмотрим создание и работу процессов на примере процедуры. Так как sh-процедура — исполняемый файл, то процесс его выполнения обеспечивается в ОС обычными механизмами построения и управления процессами. Для каждой sh-процедуры строится свой процесс со своим дескриптором — порожденный процесс. В дескрипторе процесса хранится информация, необходимая ядру для управления процессом. Дескриторы хранятся в адресном пространстве ядра ОС в виде двунаправленного приоритетного списка, упорядоченного в соответствии с их номерами – идентификаторами процессов (PID).

Пример: $ vi proc date

ls

$sh proc < дата> f2

$

65

Рассмотрим, как реализуются процессы процедуры примера.

В ответ на приглашение -$ вводится имя процедуры proc и создается порожденный процесс shell. Он вводит данные, необходимые для своего выполнения из указанного файла proc — командные строки. Каждая команда sh-процедуры выполняется порожденным для неё процессом (как обычно для команды, введенной с клавиатуры — процессы утилит). Как только все команды окажутся выполненными, sh-процесс завершается и управление возвращается родительскому процессу. Процедура выполнена.

Планировщик обрабатывает процессы двух видов – обычные и более приоритетные процессы реального времени. Место в очереди определяется его приоритетом.

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

Дескрипторы процессов создаются и удаляются динамически при выполнении процессов. Поэтому состав и размер списка постоянно меняются. Так как все процессы связаны между собой родственными отношениями, то списковая организация процессов используется для процессов одного ранга (например, для всех порожденных одним родительским или для всех родительских и т.п.). Таким образом, вся система дескрипторов представляет собой некоторую древовидную структуру с коренным общисистемным процессом (swapper – имеющего идентификатор PID=0), который компилируется в состав ядра и используется для построения всей структуры дескрипторов и ее обработки. Открывается очередь наиболее приоритетным процессом инициатора ОС (init – PID=1), который строится первым при инициализпации ОС и уничтожается при завершении работы ОС (рис. 5.1).

66

 

 

 

0

 

 

 

 

1

 

 

 

 

 

 

swapper

 

 

init

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1307

tty1

 

 

560

 

 

 

978

 

Все процессы раз

 

 

tty5

 

 

tty n

 

sh

 

 

 

 

 

 

 

 

 

 

 

 

Родительский

 

 

sh

 

 

 

 

 

 

Процесс

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

561

 

562

 

563

 

 

 

 

 

Рис. 5.1. Схема очередей процессов, иллюстрирующая рализацию свойств многозадачной и многопользовательской ОС UNIX

Процесссор выделяется каждому процессу в очереди на ограниченные кванты времени в отличие от однозадачного режима (DOS), где процессор выделяется процессам последовательно на все время выполнения процесса. Это принципиально отличает многозадачный режим обработки заданий в UNIX. В UNIX пересчет приоритетов происходит постоянно по прерываниям определенного типа с частотой — около одного раза в секунду.

Часть информации дескриптора может быть выведена в листинг характеристик процесса с помощью специальной команды ps (см. ниже). Некоторые заголовки полей листинга:

-номер терминала, которому принадлежит процесс (TTY);

-приоритет (PRI);

-использованное время процессора (TIME);

-идентификатор процесса (PID);

-имя программы процесса или команды, выполняемой в теле процедуры на момент запроса листинга (CMD);

-идентификатор родительского процесса (PPID);

67

-адрес процесса (ADDR);

-величина изменения значения приоритета (NI) и пр.

Полную информацию о процессе пользователь или администратор может получить с помощью команды ps. По умолчанию эта команда выводит информацию о процессах пользователя данного терминала.

$ps [-k] [<входное_имя_пользователя>] — вывод листинга характеристик процесса.

Некоторые значения ключей:

-a[l] — показать процессы данного терминала; -af — полный (достаточный) формат сообщения; -afl — длинный формат;

-u — показать все активные процессы данного пользователя; — показать все активные процессы.

Пример:

 

 

 

PID

PPID

TTY

PRI TIME

CMD

$ps

-flu lev

 

 

 

927

1

tty5

0:04

sh

1001 927

tty5

0:02

ps

 

 

 

 

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

$ps -f|grep <имя_пользователя>.

Для управления состоянием процессов при оперативной работе можно использовать сочетание управляющих клавиш. При одновременном нажатии их в ВС вырабатывается прерывание определенного типа, которое и приводит к изменению сосотояний процессов (как прикладных, так и системных):

<ctrl.S> — «зависает» активный процесс диалогаспользователем; <ctrl.Q> — продолжить выполнение процесса;

<ctrl.D> — конец набора текста с клавиатуры; <ctrl.Z> — приостанов активного процесса; <ctrl.C> — выход из утилиты.

68

5.2. СОЗДАНИЕ ФОНОВЫХ ПРОЦЕССОВ

При обычном запуске с терминала некоторой программы на исполнение (системной утилиты или прикладной задачи) интерпретатором shell создается привилегированный процесс, который все время связан со своим терминалом. Запуск следующего процесса может быть выполнен пользователем только после завершения текущего, т.е. при появлении приглашения '$' от интерпретатора.

В целях использования возможности параллельного выполнения программ в ОС UNIX отдельные задачи или задания пакетного режима могут быть запущены одновременно с заданиями диалогового режима. Для запуска фонового (параллельного с другими потомками) процесса в командную строку необходимо и достаточно последним символом добавить знак & (амперсанд):

$ cc prog.c & [1]2388

$

Shell выводит номер этого процесса (PID) и разрешает ввод следующей команды.

Фоновые процессы обладают некоторыми недостатками:

-не допускают ввода с клавиатуры;

-обеспечивают вывод на экран, но при этом нарушают целостность вывода диалогового процесса.

Общепринятый прием исключения влияния фонового вывода

на интерактивную работу: $<командная_строка> > имя_файла.out &

-<командная_строка> планирует задание для фонового режима;

-перенаправляет вывод вместо экрана в указанный файл головного каталога пользователя.

Пример:

$grep ааа* > grep.out & [2]194

$ps

PID

TTY

TIME

CMD

194

tty5

0:02

grep

200

tty5

0:01

ps

 

 

69

 

Особенности работы с фоновым режимом:

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

-программа, выполняемая в фоновом режиме, не может быть прервана <Ctrl*C>, так как она отсоединяется от клавиатуры и может быть прекращена только с помощью команды kill или выходом из системы;

-выход из системы exit надо выполнять два раза: для завершения фонового процесса и завершения основного процесса shell.

Вслучаях, когда фоновый процесс все же требует ввода данных

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

fg %N — перевод фонового процесса в оперативный; bg %N — перевод оперативного в фоновый режим.

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

Номер задания “N” выводится:

-при запуске фоновой программы;

-командой jobs без приостановленя или с приостановлением фонового процесса.

Приостановить выполнение процесса с выходом в shell (например, для анализа состояния и результатов работы процедуры) можно с помощью прерывания

<ctrl*Z>

$

с последующим запуском приостановленного процесса.

Пример: $inf>f.out&

#запуск процедуры inf в фоновом режиме;

[1] 1754

#номер задания и идентификатор процесса; $jobs

%1

70