Порождение нового процесса - fork

Для того, чтобы запустить параллельно новую программу,необходимо прежде всего уметь запускать параллельный про-цесс. Для этого в ОС ДЕМОС служит функция " fork " (развет-виться): -71- proc _ id = fork () Программа разделяется на две идентичные копии, которые про-должают выполняться как два независимых процесса. Одна изпрограмм - процесс "сын" - получает от функции fork кодответа 0, другая - "родитель" - получает номер, под которымзапущен процесс "сын". В простейшем случае для запускапараллельной программы вызов fork комбинируется с execl сле-дующим образом: if (fork () == 0) { /* Это процесс - сын */... настройка файлов... execl (...); /*Сюда мы попадаем при ошибке в execl */ perror ("Не могу запустить процесс"); exit (1); }... продолжение основной программы... Здесь программа после вызова fork анализирует, в каком про-цессе ("родитель" или "сын") она выполняется и, в зависи-мости от этого, ведет себя по разному. Если основная прог-рамма должна ждать окончания "сына", то она должна вызватьфункцию wait: int status;... if (fork () == 0) {... execl (...); exit (1); } wait (&status)); Функция wait возвращает идентификатор процесса - "сына", изасылает в переменную status код завершения этого процесса.Код завершения состоит из двух частей - младшие 8 битов фор-мируются системой и обозначают причину окончания процесса; вслучае нормального окончания по функции exit " они содержат0. Старшие 8 битов в случае, если программа окончилась врезультате вызова exit, берутся из аргумента вызова функции exit; обычно передается 0 при нормальном завершении и число,отличное от нуля, в случае каких либо ошибок. Ни fork, ни execl не затрагивают открытых файлов, после fork ранее открытые файлы начинают использоваться обоимипроцессами совместно, то есть используются одни и те же ука-затели позиции чтения/записи. Если новому процессу требу-ется передать какие то открытые файлы, или изменить файлыстандартного ввода/вывода, настройка программы на эти файлыделается после вызова fork в процессе-сыне до вызова execl. Следует заметить, что при буферизованном вводе/выводе необ-ходимо сбросить буфера перед вызовом fork (), иначе выводнакопленной информации может произойти дважды - и в -72- "родительском", и в новом процессе.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: