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


Методические указания к работе



Иерархия процессов

 

 

В операционной системе UNIX все процессы, кроме одного, создающегося при старте операционной системы, могут быть порождены только какими-либо другими процессами. В качестве прародителя всех остальных процессов в подобных UNIX -системах могут выступать процессы с номерами 1 или 0. Таким образом, все процессы в UNIX связаны отношениями процесс-родитель - процесс-ребенок и образуют генеалогическое дерево процессов. Для сохранения целостности генеалогического дерева в ситуациях, когда процесс-родитель завершает свою работу до завершения процесса-ребенка, идентификатор родительского процесса в данных ядра процесса-ребенка ( PPID - Parent Process IDentificator ) изменяет свое значение на значение 1, соответствующее идентификатору процесса init, время жизни которого определяет время функционирования операционной системы.

Каждый процесс в операционной системе получает уникальный номер - ( PID - Process IDentificator ). При создании нового процесса операционная система пытается присвоить ему свободный номер больший, чем у процесса, созданного перед ним.

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

 

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

#include < sys/types.h>

#include < unistd.h>

pid_t getpid(void);

pid_t getppid(void);

 

Задание 1.

Напишите программу, печатающую значения PID и PPID для текущего процесса. Запустите ее несколько раз подряд. Посмотрите, как меняется идентификатор текущего процесса. Объясните наблюдаемые изменения.

Создание процесса в UNIX

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

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

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

 

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

#include < sys/types.h>

#include < unistd.h>

pid_t fork(void);

 

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

pid = fork();

if (pid == -1){

...

/* ошибка */

} else if (pid == 0){

...

/* ребенок */

...

} else {

...

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

...

}

Задание 2.

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

 

Завершение процесса. Функция exit()

 

Прототип функции

#include < stdlib.h>

void exit(int status);

 

 

Описание функции

 

 

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

Возврата из функции в текущий процесс не происходит, и функция ничего не возвращает.

Значение параметра status - кода завершения процесса - передается ядру операционной системы и может быть затем получено процессом, породившим завершившийся процесс. Для кода завершения допустимы значения от 0 до 255. По соглашению, код завершения 0 означает безошибочное завершение процесса.

 

 

Параметры функции main() в языке С

Переменные среды и аргументы командной строки

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

int main(int argc, char *argv[], char *envp[]);

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

Задание 3.

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

Прототипы функции

#include < unistd.h>

int execlp(const char *file, const char *arg0,

... const char *argN, (char *)NULL)

int execvp(const char *file, char *argv[]),

int execl(const char *path, const char *arg0

... const char *argN, (char *)NULL)

int execv(const char *path, char *argv[])

int execle(const char *path, char *arg0,

... const char *argN, (char *)NULL, char *envp[])

int execve(const char *path, char *argv[], char *envp[])

Описание функций

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

Аргумент file является указателем на имя файла, который должен быть загружен. Аргумент path - это указатель на полный путь к файлу, который должен быть загружен.

Аргументы arg0 и argN представляют собой указатели на аргументы командной строки. Заметим, что аргумент arg0 должен указывать на имя загружаемого файла. Аргумент argv представляет собой массив из указателей на аргументы командной строки. Начальный элемент массива должен указывать на имя загружаемой программы, а заканчиваться массив должен элементом, содержащим указатель NULL.

 

 

Системный вызов wait():

Процесс-предок имеет возможность получить информацию о завершении своего потомка. Для этого служит системный вызов wait():

#include < sys/types.h>

#include < sys/wait.h>

pid_t wait(int *status);

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

Возвращаемым значением wait() будет идентификатор завершенного процесса, а через параметр status будет возвращена информация о причине завершения процесса (завершен путем вызова _ exit(), либо прерван сигналом ) и коде возврата.

Если процесс не интересуется этой информацией, он может передать в качестве аргумента вызову wait() NULL -указатель.

Конкретный формат данных, записываемых в параметр status, может различаться в разных реализациях ОС. Во всех современных версиях UNIX определены специальные макросы для извлечения этой информации, например:

макрос WIFEXITED(*status) возвращает ненулевое значение, если процесс был завершен путем вызова _ exit(), при этом макрос WIFEXITED(*status) возвращает статус завершения, переданный через _ exit().

 

Задание 4.

Написать программу, моделирующую команду Shell. В каждом из процессов используется стандартный ввод/вывод. Аргументы, необходимые программе, задаются в командной строке.

Варианты:

1. Создайте три исполняемых файла: f1, f2. f3, печатающие соответственно: “first”, “second”, “third”. Напишите программу для запуска команды./ file f1 f2 f3.

Объясните полученный результат.

 

2. Напишите и отладьте программу, в которой процесс-предок порождает два процесса, каждый из которых запускает команду echo c собственным текстом. Предок должен дождаться завершения потомков, после чего продолжить выполнение, завершая свою работу выдачей сообщения “All children terminated\n”.

Объясните работу программы и полученные результаты.

3. Напишите и отладьте программу, запускающую команду отдельной компиляции двух файлов.

/prog f1.c f2.c

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

 

В вариантах 4-7:

pri - имена процессов,

argj - аргументы процессов,

f.dat - файл входных данных,

f.rez - файл результатов.

Имена запускаемых процессов и используемых файлов задавать в командной строке

4../pr1< f.dat> f.rez

5../pr1 & & pr2

6../pr1 || pr2

7. pr1; pr2; …; prn

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

1. Дайте понятие процесса в ОС UNIX, контекста процесса.

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

3. Расскажите о создании процессов в UNIX.

4. Какие функции позволяют организовать системный вызов exec() в программе на С в ОС UNIX? Для чего этот вызов предназначен?

5. Объясните общую схему организации различной работы процесса-ребенка и процесса-родителя.

6. Расскажите об аргументах функции main().

7. Как можно корректно организовать работу родительского процесса и его потомков (чтобы родитель дожидался окончания работы потомков)?

8. Объясните структуру: fork( ) + exec( ) в ОС UNIX.

 


Лабораторная работа № 4

(8 часов)

Организация взаимодействия процессов

через каналы pipe и FIFO в OC UNIX.

Цель работы

Освоить технологию программного управления взаимодействием процессов с помощью объектов ядра - именованный канал FIFO и неименованный канал pipe ; изучить особенности применения разных каналов.

 

 

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

 

 

1.Освоить: понятие потока ввода-вывода; работу с файлами через системные вызовы и стандартную библиотеку ввода-вывода; понятие файлового дескриптора; системный вызов open(); с истемные вызовы close(), read(), write(). 2.Понятие pipe. Системный вызов pipe(). Организация связи через pipe между процессом-родителем и процессом-потомком. Наследование файловых дескрипторов при вызовах fork() и exec(). Особенности поведения вызовов read() и write() для pip'a.

3.Выполнить задание 1 в соответствии с вариантом и продемонстрировать работу программы преподавателю.

4. Понятие FIFO. Использование системного вызова mknod() для создания FIFO. Функция mkfifо(). Особенности поведения вызова open () при открытии FIFO.

5.Организовать программно на языке С модель клиент-сервер в соответствии с описанием в задании 2 и продемонстрировать работу модели с использованием двух псевдотерминалов преподавателю.

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

 

Ключевые слова: поток ввода-вывода, файловый дескриптор, таблица открытых файлов процесса, стандартный поток ввода, стандартный поток вывода, стандартный поток вывода для ошибок, открытие файла, закрытие файла, pipe, FIFO, файл типа FIFO, системные вызовы open, read, write, close, pipe, mknod, mkfifo.

Методические указания

 

 


Поделиться:



Популярное:

  1. VI. Регламент переговоров ДСП станции, машинистов (ТЧМ) и составителя поездов при маневровой работе
  2. VII. Сигналы, применяемые при маневровой работе
  3. Адаптивные процессы и адаптационные технологии в социальной работе.
  4. Безопасность при работе в смотровой канаве (каска, электроинструмент, кто может находится в смотровой канаве).
  5. БЛОК ИНФОРМАЦИИ И МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ТЕМЕ
  6. В дальнейшем действуйте в соответствии с указаниями штаба гражданской обороны и местной Администрации.
  7. В курсовой работе необходимо
  8. В работе ставится цель - изучить влияние переменного параметра в одной из параллельных ветвей на величины и фазы токов ветвей и источника питания.
  9. В этой работе философия предстает как искусство существования и медицинская практика.
  10. ВЗАИМОДЕЙСТВИЕ УДО И СЕМЬИ В РАБОТЕ ПО ОЗНАКОМЛЕНИЮ ДЕТЕЙ С ПРИРОДОЙ.
  11. Виртуозные приёмы при работе руками для великолепного времяпрепровождения
  12. Вопрос № 2. Порядок составления денежных отчетов ф.6, ф7, ф.8 и годовых отчетов о работе на узлах и станциях ФПС.


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


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