Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Базовые примитивы для работы с процессами.

Поиск

Системный вызов fork

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

В результате успешного вызова fork ядро создает новый процесс, который является почти точной копией вызывающего процесса. Созданный процесс называется дочерним процессом (child process), а процесс, осуществивший вызов fork, называется родителем (parent).

Системный вызов ехес.

Для смены исполняемой программы можно использовать функции семейства ехес. Основное отличие между разными функциями в семействе состоит в способе передачи параметров. В конечном итоге все эти функции выполняют один системный вызов execve.

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

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

Системный вызов exit.

Системный вызов exit завершает процесс:

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

Системный вызов wait.

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

После завершения дочернего процесса выполнение родительского процесса продолжится.

 

Обработка сигналов в UNIX

Нормальное и аварийное завершение

Получение большинства сигналов приводит к нормальному завершению процесса. Действие сигнала при этом похоже на неожиданный вызов процессом функции _exit. Статус завершения, возвращаемый при этом родительскому процессу, сообщит о причине завершения дочернего процесса. В файле <sys/wait.h> определены макросы, которые позволяют родительскому процессу определить причину завершения дочернего процесса (получение сигнала и, собственно, значение сигнала).

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

Задание обработчика сигналов: вызов sigaction

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

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

Посылка сигналов другим процессам: вызов kill

Процесс вызывает процедуру sigaction для установки реакции на поступление сигнала. Первый параметр pid определяет процесс или процессы, которым посылается сигнал sig. Обычно pid является положительным числом, и в этом случае он рассматривается как идентификатор процесса

Посылка сигналов самому процессу: вызовы raise и

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

Вызов alarm - это простой и полезный вызов, который устанавливает таймер процесса. При срабатывании таймера процессу посылается сигнал.

Системный вызов pause ОС UNIX также содержит дополняющий вызов alarm системный вызов pause, который определен следующим образом:

Вызов pause приостанавливает выполнение вызывающего процесса до получения любого сигнала, например, сигнала SIGALRM.

Примитивы межпроцессного взаимодействия: программные каналы.

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

Каналы создаются в программе при помощи системного вызова pipe. В случае удачного завершения вызов сообщает два дескриптора файла: один для записи в канал, а другой для чтения из него. Вызов pipe определяется следующим образом:

Запись и чтение каналов.

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

Использование системного вызова select для работы с несколькими каналами.

Для работы с множеством каналов используется системный вызов select. Например в том случае, если родительский процесс выступает в качестве серверного процесса и может иметь произвольное число связанных с ним клиентских (дочерних) процессов. В конечном итоге получится однонаправленный поток данных от дочернего процесса к родительскому.

 

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

Дополнительные средства межпроцессного взаимодействия в UNIX.

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

Блокировка записи при помощи вызова fcntl.

Cистемный вызов fcntl позволяет процессу устанавливать для дескриптора файла флаг O_NONBLOCK. Это предотвращает блокировку последующих вызовов. Вызов fcntl предлагает два типа блокировки:

1) блокировка чтения (read locks) - просто предотвращает установку другими процессами блокировки записи при помощи вызова fcntl.

2) блокировка записи (write locks) - предотвращает установку другими процессами блокировку чтения или записи для файла.

Аргумент filedes должен быть допустимым дескриптором открытого файла. Для блокировки чтения дескриптор filedes должен быть открыт при помощи флагов O_RDONLY или O_RDWR. Для блокировки записи дескриптор filedes должен быть открыт при помощи флагов O_WRONLY или O_RDWR.

Команды, которые относятся к блокировке записей:

F_GETLK – получает описание блокировки на основе данных, передаваемых в аргументе ldata.

F_SETFLK – применяет блокировку к файлу и немедленно возвращает управление, если это невозможно.

F_SETLKW – применяет блокировку к файлу и приостанавливает работу, если блокировка уже наложена другим процессом.

Очереди сообщения.

Сообщение – это последовательность символов или байтов. Сообщения передаются между процессами при помощи очередей сообщений, которые можно создавать или получать к ним доступ при помощи вызова msgget. После создания очереди процесс может помещать в нее сообщения при помощи вызова msgsnd, если он имеет соответствующие права доступа.

Этот вызов лучше всего представить как аналог вызова open или creat. Параметр key – простое число, идентифицирующее очередь сообщений в системе. В случае успешного вызова, после создания новой очереди или доступа к уже существующей, вызов msgget вернет ненулевое целое значение, которое называется идентификатором очереди сообщений

Разделяемая память.

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



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 201; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.18.135 (0.009 с.)