double arrow

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

3

Для того, чтобы запустить параллельно новую программу,необходимо прежде всего уметь запускать параллельный про-цесс. Для этого в ОС ДЕМОС служит функция "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- "родительском", и в новом процессе.

3

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