Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Перенаправление ввода-вывода



Три направления ввода-вывода являются выделенными - стандартный ввод, вывод и поток ошибок ( stdin, stdout, stderr ). По умолчанию, все три потока связаны (ассоциированы) с терминалом. При этом программа выводит все свои сообщения в том числе и об ошибках на терминал. Shell позволяет перенаправить эти стандартные потоки, установить ввод-вывод и объединение потоков.


Перенаправление потоков ввода-вывода.


> file Перенаправление стандартного потока вывода в файл file


> > file -Перенаправление стандартного потока вывода в файл file с добавлением в конец файла.


< file -получение стандартного потока ввода из файла file.


prog1 | prog2 -Передача выходного потока программы prog1 во входной поток программы prog2.


n> file -Перенаправление стандартного потока с дескриптором n в файл file.


n> > file -Перенаправление стандартного потока с дескриптором n в файл file с добавлением в конец файла.


n> & m -Объединение потоков с дескрипторами n и m.

 

Пример:

$ prog1 > /dev/null 2> & 1


/dev/null - это псевдоустройство, которое уничтожает направленный в него поток.


Передача потока вывода одной программы в поток ввода другой используется часто. Например:

$ gzip -d archive.tar.gz | tar –xf

Здесь происходит разархивация файла archive.tar.gz, запакованного двумя архиваторами. Выходной поток от утилиты gzip передается во входной поток утилите tar. Аналогично эту же операцию можно было выполнить и по другому:


$ gzip -d archive.tar.gz

$ tar -xf archive.tar


Поскольку язык Bourne Shell является процедурным языком программирования, в нем также как и в других подобных языках есть операторы, позволяющие управлять последовательностью выполнения команд. Необходимым оператором является проверка некоторого условия, в зависимости от выполнения которого определяется дальнейший ход программы. Таким оператором является команда test. Эта команда проверяет выполнение некоторого условия. У команды test существует два варианта вызова:


test условие


или

[ условие ]


Следует отметить, что между скобкой и условием необходимо наличие пробелов, иначе Shell не сможет опознать " [" как команду test. При успешном завершении test возвращает " 0" .

 

Условия проверки файлов:

-f file Файл " file" является обычным файлом.

-d file Файл " file" является каталогом.
-c file Файл " file" является специальным файлом.
-r file Файл " file" имеет разрешение на чтение.

-w file Файл " file" имеет разрешение на запись.

-x file Файл " file" имеет разрешение на исполнение.

-s file Файл " file" не пустой.

Условия проверки строк:


string1=string2 Строки string1 и string2 совпадают.


string1! =string2 Строки string1 и string2 не совпадают.


-n string1 Строка string1 существует.

-z string1 Строка string1 не существует.


Условия операций с целыми числами:


x -eq y x равно y


x -ne y x не равно y

 

x -gt y x больше y


x -ge y x больше или равно y


x -lt y x меньше y


x -le y x меньше или равно y


В этом случае команда test воспринимает строки именно как целые числа. Нулевому значению так же соответствует пустая строка.

 

 

Логические операции в контексте test

 

 

! (not) Логическое " НЕ"


-o (or) Логическое " ИЛИ"

-a (and) Логическое " И"

Условный оператор " if"

 

 

Общий вид использования условного оператора if представляется следующим образом:


if < условие>

then < список команд>

[ elif < условие>

then < список> ]

[else < список> ]

Fi


Выражения, выделенные в квадратных скобках, являются необязательными. Т.е. можно представить наиболее употребительную " порезанную" модификацию условного оператора:


if < условие>

then < список команд>

fi


В этом случае если < условие> выполнено (код завершения 0 ) то выполняется < список команд>. В противном случае < список команд> пропускается.

 

Оператор выбора case

 

 

В общем случае синтаксис оператора case выглядит следующим образом:


case < строка> in

Шаблон 1)

Cmd1

Cmd2

........

;;

Шаблон2)

Cmd3

Cmd4

........

;;

....

*)

Cmdn

........

;;

Esac

 

Значение < строка> сравнивается с шаблонами, по порядку. Если было найдено совпадение, тогда выполняются команды соответствующего раздела. Следует отметить, что шаблоны допускают использование масок. Если совпадения не было найдено, тогда выполняются команды из раздела с шаблоном " *" (аналогично default селектора switch в С ).

 

Для примера приведем кусочек инициализационного скрипта BSD UNIX. Здесь переменные ( inetd_enable и inetd_flags) были получены из другого файла ( rc.conf).


. /etc/rc.conf


case {$inetd_enable} in

[Yy][Ee][Ss])

if [ -x /usr/sbin/inetd ]; then

/usr/sbin/inetd $inetd_flags


fi

;;

esac

 

Оператор цикла с перечислением for

 

 

Синтаксис оператора for в общем случае имеет следующую структуру:


for < имя> [in список значений]

do

< список команд>

Done


Фрагмент, выделенный в квадратные скобки, может отсутствовать. Оператор for обеспечивает выполнение цикла столько раз, сколько слов в списке значений. При этом переменная < имя> принимает последовательно значения слов из списка. Сам по себе список может формироваться из вывода других команд. Если же список отсутствует, тогда < имя> принимает значения, переданные как позиционные параметры скрипта.

 

Оператор цикла с истинным условием while

 

Синтаксис оператора while в общем случае имеет следующую структуру:

while < условие>

do

< список команд>

Done


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

 

Оператор цикла с ложным условием until

 

 

Синтаксис оператора until в общем случае имеет следующую структуру:


until < условие>

do

< список команд>

Done


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

Основные команды ОС UNIX для работы с файлами

1. Команда pwd.

Синтаксис: pwd.

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

Задание 1.

Воспользуйтесь командой pwd для определения своей домашней директории.

Отразите команду и результат ее работы в отчете.

2. Команда man.

Синтаксис: man имя.

 

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

Описание : UNIX MANUAL - руководство по операционной системе UNIX. Информация оттуда доступна в интерактивном режиме с помощью утилиты man.

Задание 2.

С помощью утилиты man посмотрите информацию о команде pwd.

Запишите кратко информацию о команде в отчет (на русском языке).

 

3. Команда cd.

Синтаксис: cd имя_директории.

 

Описание: это команда смены текущей директории. Имя_директории - это полное или относительное имя директории, которую вы хотите сделать текущей.

cd без параметров текущей сделает вашу домашнюю директорию.

Задание 3.

Сделайте текущей директорию на уровень выше. Проверьте это, затем вернитесь в свою домашнюю директорию. Проверьте смену директории.

Выполнение проделанных команд отразите в отчете.

4. Команда ls.

Синтаксис: ls имя_директории

Описание: команда просмотра состава указанной директории.

ls без параметров распечатывает список файлов из текущей директории.

В полученный список не войдут файлы, имена которых начинаются с символа “. ” - файлы, созданные различными системными программами в своих целях. Посмотреть полный список файлов можно, указав в команде ls ключ “-a”,

т.е. ls -aимя_директории

 

 

Права доступа к файлам

С каждым файлом в ОС UNIX связано 12-битное слово, называемое «правами доступа» к файлу.

Младшие 9 бит этого слова объединены в три группы по три бита; каждая группа задает права доступа для владельца файла, для его группы и для всех остальных пользователей. Три бита в каждой группе отвечают за право на чтение, запрос и использование файла.

Чтобы узнать права доступа к тому или иному файлу, можно воспользоваться командой

Ls –l

, например:

> ls -l /bin/cat

-rwxr-xr-x l root root 14232 Feb 4 2003 /bin/cat

 

Расположенная в начале строки группа символов -rwxr-xr-x показывает тип файла (первый символ; минус означает, что мы имеем дело с обыкновенным файлом, буква d означала бы каталог и т.п.) и права доступа, соответственно, для владельца (в данном случае rwx, т.е. чтение, запись и исполнение), группы и всех остальных (в данном случае r-x , т.е. права на запись отсутствуют). Таким образом, файл /bin/cat доступен любому пользователю на чтение и исполнение, но модифицировать его может только пользователь root (т.е. администратор).

Можно записать слово прав доступа к файлу в виде восьмеричного числа (3 знака - восьмеричная цифра), трехзначного (владелец, группа, остальные пользователи) каждый знак в этом трехзначном восьмеричном числе формируется как сумма прав: 4- права на чтение, 2- права на запись, 1 - на использование (из двоичной триады): (111)2=20+21+22=(1+2+4)10.

Например, 7 = 1 + 2 + 4 Þ права rwx

4 2 1

6 = 0 + 2+ 4 Þ права rw- -

4 2 0

и т.д.

В трехзначном числе задания прав: 744 для владельца определены все права, для группы - только чтение, для остальных пользователей - только на чтение.

Для использования прав доступа к файлам используется команда chmod, которая позволяет задать новые права доступа в виде восьмеричного числа, например:

$ chmod 744 filel.c.

 

Задание 4.

а) Для получения полной информации о команде ls воспользуйтесь утилитой man. Перенаправьте вывод команды в какой-либо текстовый файл.

б) Посмотрите полное содержимое текущей директории и перенаправьте этот вывод также в текстовый файл.

в) С помощью команды ls -l < имя_файла> выведите информацию о правах доступа к тому текстовому файлу, с которым вы работали в п. 4б, затем перенаправьте эту информацию в тот же текстовый файл. Объясните полученный вывод.

 

5. Команда cat.

Перенаправление ввода/вывода.

Для просмотра содержимого небольшого текстового файла на экране можно воспользоваться командой:

сat имя_файла

Внимание! Не пытайтесь просматривать таким образом содержимое директории и бинарных файлов.

Большой тестовый файл удобно просматривать командой more (описание использования найдите в UNIX MANUAL ). Почему здесь неудобна команда сat ?

В команде сat можно задавать несколько имен файлов:

сat файл1 файл 2 … файл N

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

Можно перенаправить вывод в какой-нибудь файл:

сat файл 1 файл 2 > файл_ результатов

Перенаправление вывода со стандартного потока вывода (экрана) в файл является стандартным для всех команд. Перенаправить стандартный ввод (с клавиатуры), например, брать данные для программы из файла, можно с помощью знака “< ”.

сat > новый_файл - создаст новый текстовый файл с содержимым, вводимым вами с клавиатуры.

Прервать процесс ввода данных - [Ctrl+D]

 

Задание 5.

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

6. Простейшие команды работы с файлами: cp, rm, mkdir, mv

Для создания новой директории используется команда:

mkdir имя_директории

Для копирования содержимого одного файла в другой используется команда:

cp файл_источник файл_назначение.

 

Команда

cp файл 1 файл 2 …. файл N директория назначения

служит для копирования файла или файлов в уже существующую директорию с именем директории_назначения под своими именами. Вместо имен копируемых файлов можно использовать их шаблоны. Шаблоны задаются с помощью метасимволов:

* - соответствует всем цепочкам литер, включая пустую.

? - все одиночные литеры

[ …] - соответствует любой литере, заключенной в скобки. Пара литер, разделенных минусом, задает диапазон литер.

 

Команда

cp - r дир_источник дир_назначение

служит для рекурсивного копировария одной директории (дир_источник) в новую директориию (дир_назначение).

Вместо имен в командах копирования могут использоваться их шаблоны.

 

Команда

rm файл 1 файл 2 …. файл N

позволяет удалить 1 или несколько регулярных файлов из текущей директории.

Вместо имен могут использоваться шаблоны. Если хотите удалить одну или несколько директорий вместе с их содержимым (рекурсивное удаление) в команде rm используйте ключ -r

Rm-r дир 1 дир 2

Команда переименования:

mv имя_источника имя_назначения

- файл с именем имя_источника переименовывает в файл с именем имя_назначения. При этом перед выполнением команды файла с именем имя_назначения существовать не должно.

Задание 6.

Создайте новую директорию внутри своей домашней. Организуйте там небольшой тестовый файл с содержимым из двух строк:

«Изучаю работу в ОС UNIX

Организую скрипт».

Скопируйте содержимое этого файла в другой - с тем же именем, но в директории /home. Удалите первоначально созданный файл из вашей директории, если копирование прошло успешно. Проверьте содержимое использованных директориий и файлов.

Задание 7.

1). Когда вы освоили работу в интерактивном режиме с простейшими командами ОС UNIX, создайте с помощью редактора Kwriter скрипт со сценарием, соответствующим последовательному выполнению:

Задание 3,

Задание 4Б, 4В,

Задание 5,

Задание 6.

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

Необходимо, чтобы в командном файле была организована грамотная выдача запросов на ввод данных с клавиатуры с помощью команды: $ echo - n “текст запроса”.

2). Сохраните скрипт с именем Myscript1, запустите его на выполнение командой

sh Myscript1

введите запрашиваемые данные и проверьте полученные результаты.

3). Составьте отчет о выполненной лабораторной работе, в котором должна быть отражена и ваша работа в интерактивном режиме и со скриптом, включая текст скрипта (с комментариями) и полученные результаты на экране и в файлах.

Системные вызовы getuid и getpid

Узнать идентификатор пользователя, запустившего программу на выполнение, - UID и идентификатор группы, к которой он относится , -GID можно с помощью системных вызовов getuid() и getpid(), применив их внутри этой программы.

Прототипы системных вызовов:

 

#include < sys/types.h>

#include < unistd.h>

uid_t getuid(void);

gid_t getgid(void);

Задание 8.

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

Включите программу с результатами в отчет.

Контрольные вопросы

1. Понятие файла в ОС UNIX. Что такое домашняя директория?

2. Какие существуют средства группирования команд Shell -интерпретатора? приведите примеры использования.

3. Как осуществляется перенаправление ввода-вывода?

4. Что такое конвейер команд? приведите пример.

5. Как средствами Shell выполнить арифметические действия над Shell -переменной?

6. Каковы правила генерации имен файлов?

7. Как выполняется подстановка результатов выполнения команд?

8. Как интерпретировать строку cmd1 & cmd2 & ?

9. Как интерпретировать строку cmd1 & & cmd2 & ?

10. Как интерпретировать строку cmd1 || cmd2 & ?

11. Как в UNIX определены права доступа к файлу? Какой командой их можно посмотреть для конкретного файла?

12. Как определить идентификатор пользователя, запустившего программу и идентификатор его группы?

 

 

Лабораторная работа № 3.

(8 часов)

Процессы в операционной системе UNIX.

 

 

Цель работы

 

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

 

Содержание работы

 

 

1. Изучить организацию процессов в UNIX: понятие процесса, контекст процесса, жизненный цикл процесса, идентификация процессов, иерархическая структура процессов. Написать на С и отладить программу в соответствии с заданием 1.

2. Ознакомиться с созданием процесса в UNIX, с организацией завершения процесса. Написать и отладить программу (язык С ) в соответствии с Заданием 2, включить ее в отчет.

3. Изучить параметры функции main() в языке С, переменные среды и аргументы командной строки. Написать программу на языке С в соответствии с Заданием 3, отладить и включить ее в отчет вместе с результатами.

4. Изучить семейство функций для организации системного вызова exec().

5. Написать программу на языке С в соответствии с вариантом Задания 4, выданного преподавателем, отладить программу и продемонстрировать полученные результаты преподавателю. Включить программу с результатами в отчет.

6. Защитить работу преподавателю, ответив на контрольные вопросы.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 1040; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.103 с.)
Главная | Случайная страница | Обратная связь