Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС.docx
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
471.16 Кб
Скачать
  1. Способы группирования команд в операционных системах. Командные файлы. Программные каналы, конвейеры команд.

Группировка команд:

&& - выполнить вторую команду, если первая выполнится успешно

|| - не выполнять вторую, если первая выполнилась успешно.

() – запуск команды в отдельном shell

{} – логическая группировка команд

&- команды выполняются параллельно, первая в фоновом режиме, вторая - как обычно

`команда` - подстановка результата выполнения команды

k0||{k1 && k2; k3}: k0,k1, k2 и k3 – команды. При неудачном выполнении k0 будет выполнено выражение в {}. k2 будет выполнена только при успешном завершении k1; после любого из исходов обработки k2 (т.е. k2 будет выполнена, либо пропущена) будет выполнена k3.

{k1 >> f1; k2 > f2} &: В фоновом режиме будет выполняться последовательность команд k1(вывод перенаправлен в конец файла f1) и k2 (вывод перезапишет файл f2).

; - последовательное выполнение

Конвеер позволяет использовать вывод одной команды в качестве ввода другой. Конвеер по сути это программный канал для создания потока данных от команды к команде: команда_1 | команда_2 | команда_3 | ... | команда_n. Команды выполняются последовательно.

Программные каналы делятся на именованные и неименованные.

  • Неименованный канал является средством взаимодействия между связанными процессами - родительским и дочерним. Родительский процесс создает канал при помощи системного вызова: int pipe(int fd[2]), который возвращает два файловых дескриптора — fildes[0] для записи в канал и fildes[1] для чтения из канала. Теперь, если один процесс записывает данные в fildes[0], другой сможет получить эти данные из fildes[1]. Дочерний процесс наследует и разделяет все назначенные файловые дескрипторы родительского. То есть доступ к дескрипторам fildes канала может получить сам процесс, вызвавший pipe, и его дочерние процессы. Если нужен двунаправленный обмен данными между процессами, то родительский процесс создает два канала, один из которых используется для передачи данных в одну сторону, а другой - в другую.

  • Именованные каналы (FIFO) могут использоваться как средство взаимодействия между неродственными и удаленными процессами. Такой канал имеет внешнее имя, которое включается в пространство имен файловой системы. FIFO является отдельным типом файла в файловой системе UNIX ( ls –l покажет символ р в первой позиции). Для создания FIFO используется системный вызов int mknod(char *pathname, int mode, int dev); где pathname – указатель на строку, содержащую имя файла в файловой системе (имя FIFO), mode — флаги владения, прав доступа и т. д., dev — при создании FIFO игнорируется. После создания FIFO может быть открыт на запись и чтение, причем запись и чтение могут происходить в разных независимых процессах. При работе с именованным каналом используются файловые системные вызовы: int open(int *name, int oflag); int read(int pipe_fd, void *area, int cnt); int write(int pipe_fd, void *area, int cnt); int close(int pipe_fd); Именованный канал является постоянным объектом, он сохраняется после завершения создавшего его процесса и при необходимости должен быть уничтожен явно - при помощи системного вызова: int unlink(char *name).

Командные файлы (Unix – Shell procedure).

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

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

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

$ <имя shell- процедуры><параметр1>< параметр2>

Каждому аргументу, передаваемому в shell- процедуру из командной строки, ставится в соответствие порядковый номер от 1 до 9 (в командном файле к аргументам можно обращаться как $1…$9). Если порядковый номер двузначный, то он должен быть заключен в фигурные скобки {}. Имени процедуры ставится в соответствие порядковый номер 0. Операторы оболочки (if, while, until, case, for) см. вопрос 5.

Подстановка переменной $a:

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

$ab - переменная ab

${a}b - конкатенация переменной а и b