Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лабы / ОС - Лабораторная работа 3.doc
Скачиваний:
60
Добавлен:
01.06.2015
Размер:
469.5 Кб
Скачать
      1. Запуск и выполнение команд

В интерактивном (диалоговом) режиме работы шелл выдает первичное приглашениек вводу команды, вид которого определяется системной переменнойPS1. Стандартный вид приглашения $ для обычного пользователя или # для суперпользователя (администратора). В приглашение часто входит также имя текущего каталога файловой системы. Если пользователь вводит законченную команду (простую или составную), она выполняется. Если команда синтаксически не закончена, шелл выводит в следующих строкахвторичное приглашение, определяемое переменнойPS2(обычно знак >), пока команда не будет введена полностью. Пользователь может явно указать, что ввод команды не закончен (например, будут еще аргументы), для этого нужно в конце строки ввести\(т.е. как бы «заэкранировать» символ перевода строки).

Шелл bashпредоставляет пользователю удобные средства, облегчающие интерактивный ввод команд. Одним из таких средств является завершение частично набранных команд и их параметров. Для этого пользователь может при наборе команды ввести с клавиатуры один или несколько символов, а затем нажать клавишуTAB. При этомbashпрежде всего пытается «догадаться», что именно сейчас вводит пользователь: имя команды, имя файла-параметра, обращение к переменной или что-то еще. Если вводимое слово начинается с символа$, то шелл считает, что это имя переменной, и пытается найти это имя по первым символам среди имеющихся переменных. Если вводится первое слово команды,bashсчитает, что это имя команды и пытается найти завершение среди всех доступных команд. В случае, если введено недостаточно символов (имеется несколько подходящих имен), шелл выдает для справки все возможные завершения вводимого слова.

Другое средство упрощения ввода команд связано с использованием «истории», т.е. списка последних вводившихся команд. Длина списка по умолчанию равна 500 командам. Весь список может быть выдан с помощью команды history. Простейшее использование истории связано с перемещением по списку при помощи клавиши. Имеются и более тонкие возможности, например, выбор команд по номеру в списке, конструирование новой команды из отдельных частей предыдущих команд и др.

Для использования возможностей завершения слов и выбора из истории нужно либо выйти из оболочки mc, либо, по крайней мере, отключить экранmcс помощью комбинацииCtrl+O.

      1. Фоновые процессы и управление заданиями

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

[1] 7841

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

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

Пользователь может приостановить выполнение процесса переднего плана. Для этого используется специально назначенная комбинация клавиш, как правило, Ctrl+Z.

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

Шелл отслеживает изменения состояния заданий и, как правило, сообщает о них перед выдачей очередного приглашения к вводу команды. Возможными состояниями являются Running(работает в фоновом режиме),Stopped(приостановлено),TerminatedилиKilled(прекращено командойkill),Done(завершено). Последним состоянием фонового процесса обычно бываетDone, а если процесс завершился с ненулевым кодом завершения, то в круглых скобках будет указан этот код.

Любое из имеющихся заданий, как приостановленных, так и выполняющихся в фоновом режиме, может быть продолжено либо на переднем плане (команда fg %спецификация_задания), либо как фоновое (командаbg %спецификация_задания).

В качестве спецификации конкретного задания можно использовать либо его номер (тот, который указывается системой в квадратных скобках), либо имя выполняемой в задании команды, либо даже часть этого имени, лишь бы эта часть позволяла однозначно выбрать задание среди всех выполняемых заданий. Спецификация %словоозначает задание, командная строка запуска которого начиналась с указанного слова. Спецификация%?словоозначает задание, в командной строке запуска которого указанное слово содержится в любом месте. Например, любая из спецификаций%prили%?myможет означать задание, выполняющее командуprog1 myfile.c.

Спецификация %+означает задание, которое последним было запущено в фоновом режиме или приостановлено (текущее задание), а спецификация%-– предыдущее задание.

Пользователь может «убить» фоновый или приостановленный процесс с помощью команды kill(см. описание команд). Для этого нужно знать либо идентификатор процесса, либо спецификацию задания.

Команда jobsвыводит список всех заданий с указанием их состояния.

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