Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSumk.doc
Скачиваний:
37
Добавлен:
13.03.2015
Размер:
1.01 Mб
Скачать

Практические задания

  1. Изучите файловую структуру системы.

  2. Создайте домашнею директорию

  3. Создайте с помощью команды cat новый текстовый файл.

  4. Просмотрите его содержимое.  

  5. Изучите формат команд cp, rm, mkdir, mv.

  6. Научитесь с помощью команд cp, rm, mkdir, mv создавать, копировать ,удалять переименовывать файлы, создавать собственные поддиректории просматривать их содержимое и перемещаться по логическому дереву файловой системы.

  7. Результат работы покажите преподавателю.

Рекомендованная литература:6 осн.[29-37],[57-80],9 доп. [13-23],12 доп. [34-56]

Список контрольных вопросов.

  1. Какие организационные действия необходимо предпринять, если вы забыли пароль.? Какой возвращается указатель обычно для идентификации ошибочной ситуации?

  2. Какую переменную предоставляет ошибки C-интерфейс для точного определения причины?

  3. Какая стандартная функция UNIX применяется для получения символьной информации об ошибке на стандартном выводе программы для ошибок (по умолчанию экран вашего терминала)?

  4. Какие базовые понятия используются в операционной системе Unix?

  5. Какое понятие характеризует статическую сторону вычислительной системы?

  6. Что включает в себя полное имя файла?

  7. На какие категории делится информация в Linux?

  8. Назначение команды man.

  9. Простейшие команды работы с файлами и директориями.

Лабораторная работа №2 .«Редактирование файлов - ed, sed, vi.»

Цель занятия . Научить студента создавать и редактировать файлы. Научить компилировать программу на языке С и запускать ее на исполнение. Разъяснить соотношение между пользователем и группой, как пользоваться командой chmod.

Теоретический материал.

Каждый пользователь должен быть зарегистрирован в ней под определенным именем. Вычислительные системы не умеют оперировать именами, поэтому каждому имени пользователя в системе соответствует некоторое числовое значение - его идентификатор - UID (User IDentificator).Все пользователи в системе делятся на группы пользователей. В некоторых версиях UNIX каждый пользователь может входить ровно в одну группу, в некоторых - в несколько разных групп. Для каждого файла, созданного в файловой системе запоминаются имена его хозяина и группы хозяев. Заметим, что группа хозяев не обязательно должна быть группой, в которую входит хозяин. В операционной системе Linux при создании файла его хозяином становится пользователь, создавший файл, а его группой хозяев - группа, к которой он принадлежит. Впоследствии хозяин файла или системный администратор может передать его в собственность другому пользователю или изменить его группу хозяев с помощью команд chown и chgrp.Как видим, для каждого файла выделяется три категории пользователей:

1.Пользователь, являющийся хозяином файла.

2.Пользователи, относящиеся к группе хозяев файла.

3.Все остальные пользователи.

Для каждой из этих категорий пользователей хозяин файла может определить различные права доступа к файлу. Различают три вида прав доступа: право на чтение файла - r (от слова read), право на модификацию файла - w (от слова write) и право на исполнение файла - x (от слова execute). Посмотреть подробную информацию о файлах в некоторой директории, включая имена хозяина, группы хозяев и права доступа, можно с помощью команды ls с опциями -al.Узнать идентификатор пользователя, запустившего программу на исполнение, - UID и идентификатор группы, к которой он относится, - GID с помощью системных вызовов getuid() и getgid(), применив их внутри этой программы.

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

#include <sys/types.h> #include <unistd.h>   uid_t getuid(void); gid_t getgid(void);

Системный вызов getuid возвращает идентификатор пользователя для текущего процесса. Системный вызов getgid возвращает идентификатор группы пользователя для текущего процесса. Типы данных uid_t и gid_t являются синонимами для одного из целочисленных типов языка C.

Компиляция программ на языке C в UNIX и запуск их на счет. Для компиляции программ в Linuх мы будем применять компилятор gcc. Для того, чтобы он нормально работал, необходимо, чтобы исходные файлы, содержащие текст программы, имели имена, заканчивающиеся на .c. В простейшем случае откомпилировать программу можно, запустив компилятор командой

gcc имя_исходного_файла.

Если программа была написана без ошибок, то компилятор создаст исполняемый файл с именем a.out. Изменить имя создаваемого исполняемого файла  можно, задав его с помощью опции -o :

gcc имя_исходного_файла -o имя_исполняемого_файла. Запустить программу на исполнение можно, набрав имя исполняемого файла и нажав клавишу <Enter>.

Практические задания.

  1. Изучить приложение «Встроенный редактор mc».

  2. Войдите в mc и попробуйте в нем походить по директориям, посоздавать и поредактировать файлы.

  3. Изучит формат команд chown и chgrp.

  4. Определить различные права доступа к файлу.

  5. Изучит формат команды ls.

  6. Вызовите команду ls -al для своей домашней директории и проанализируйте ее выдачу.

  7. Измените права доступа .

  8. Создайте новый файл и посмотрите на права доступа к нему, установленные системой при его создании.

  9. Изучите значение маски , которые она может принимать.

  10. Измените текущее значение маски для программы-оболочки.

  11. Посмотреть текущее значение маски с помощью команды umask.

  12. Изучить назначение системных вызовов getuid и getgid .

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

Рекомендуемая литература:5 осн, [56-91], 6 осн.[514-516]

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

  1. На какие группы делятся в системе пользователи?

  2. Что такое UID?

  3. Что такое GID?

  4. Чем руководствуется операционная система при выставлении прав доступа?

  5. Какие права доступа можно определить для файла?

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

  7. Какие значения может принимать маска?

  8. Сохраняется ли маска создания файлов между сеансами работы в системе?

  9. Какое значение маски будет при новом входе в систему?

Лабораторная работа №3.« Процессы в операционной системе UNIX»

Цель занятия: Изучить иерархию процессов в UNIX, содержании контекста процесса в UNIX. Научить создавать новый процесс. Научить запускать новую программу. Изучить понятие об использовании переменных среды и аргументов командной строки. В результате выполнения работы студент должен осознать разницу между системными вызовами fork() и exec(), должен понять, как завершается программа, написанная на C, даже если она не вызывает явно функцию exit()

Теоретический материал: Все построение операционной системы UNIX основано на использовании концепции процессов. Контекст процесса складывается из пользовательского контекста и контекста ядра.Под понятием контекст ядра объединяются системный контекст и регистровый контекст. Выделим в контексте ядра стек ядра, который используется при работе процесса в режиме ядра  (kernel mode), и данные ядра, хранящиеся в структурах, являющихся аналогом блока управления процессом - PCB. В данные ядра входят: идентификатор пользователя - UID, групповой идентификатор пользователя - GID, идентификатор процесса - PID, идентификатор родительского процесса - PPID.

  Каждый процесс в операционной системе получает свой собственный уникальный идентификационный номер PID (Process IDentificator). При создании нового процесса операционная система пытается присвоить ему  свободный номер больший, чем у процесса, созданного перед ним. Если таких свободных номеров не оказывается, то операционная система выбирает минимальный из всех свободных номеров. В операционной системе Linux присвоение идентификационных номеров процессов начинается с номера 0, который получает процесс kernel при старте операционной системы.Максимально возможное значение для номера процесса в Linux на базе процессоров Intel составляет 231-1.

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

В операционной системе UNIX новый процесс может быть порожден единственным способом - с помощью системного вызова fork(). При этом вновь созданный процесс будет являться практически полной копией родительского процесса.  У порожденного процесса по сравнению с родительским процессом (на уровне уже полученных знаний) изменяются значения следующих параметров :

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

2. идентификатор родительского процесса – PPID.

Таким образом, общая схема организации различной работы процесса-ребенка и процесса-родителя выглядит так:

pid = fork(); if(pid == -1){

... /* ошибка */ ...

} else if (pid == 0){

... /* ребенок */ ...

} else {

... /* родитель */ ...

}

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

Для изменения пользовательского контекста процесса используется системный вызов exec(), который пользователь не может вызвать непосредственно. Вызов exec() заменяет  пользовательский контекст текущего процесса на содержимое некоторого исполняемого файла и  устанавливает начальные значения регистров процессора (в том числе устанавливает программный счетчик на начало загружаемой программы). Этот вызов требует для своей работы задания имени исполняемого файла, аргументов командной строки и параметров окружающей среды. Для осуществления вызова программист может воспользоваться одной из 6 функций: execlp(), execvp(), execl(), execv(), execle(), execve(), отличающихся друг от друга представлением параметров, необходимых для работы системного вызова exec

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

Практические задания.

1. Изучить формат команды PS.

2. Написать, откомпилировать и запустить программу с системными вызовами getpid() и getppid().

3. Написать программу с использованием вызова fork(), где порожденный процесс делает то же самое, что и родитель.

4 Написать, откомпилировать и запустить программу с использованием вызова fork() с разным поведением процессов ребенка и родителя.

5. Написать программу с распечаткой значений переменных среды и аргументов командной строки.

6. Написать программу с использованием системного вызова exec().

7. Написать, откомпилировать и запустить для изменения пользовательского контекста в порожденном процессе.

Рекомендованная лдитература:1 осн. [143-187]

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

  1. В чем разница между системными вызовами fork() и exec()?

  2. Как завершается программа, написанная на C?

  3. Как завершается программа, написанная на C , если она не вызывает явно функцию exit() ?

  4. Какова иерархия процессов в UNIX?

  5. Каково содержание контекста процесса в UNIX?

  6. Как создавать новый процесс?

  7. Каким образом процесс в операционной системе получает свой собственный уникальный идентификационный номер ?

Лабораторная работа №4.« Организация взаимодействия процессов через pipe и FIFO в UNIX.»

Цель занятия: усвоить понятие о потоке данных в UNIX. Научиться использовать системные вызовы open(), read(), write(), close() при работе с файлами. Научиться создавать pipe и использовать его для связи между родственными процессами. Научиться создавать FIFO и использовать его для связи между не родственными процессами.

Теоретический материал: Существует две модели передачи данных по каналам связи — поток ввода-вывода и сообщения. Из них более простой идеологически является потоковая модель, в которой операции передачи/приема информации вообще не интересуются содержимым того, что передается или принимается. Вся информация в канале связи рассматривается как непрерывный поток байт, не обладающий никакой внутренней структурой. Изучению механизмов, обеспечивающих потоковую передачу данных в операционной системе UNIX, и будет посвящена эта лабораторная работа.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]