fork — Википедия

fork

Материал из Википедии — свободной энциклопедии Перейти к навигации Перейти к поиску У этого термина существуют и другие значения, см. Форк (значения) .

fork() — системный вызов в Unix-подобных операционных системах , создающий новый процесс (потомок), который является практически полной копией процесса-родителя, выполняющего этот вызов.

Концепция ветвления процессов впервые описана в 1962 году Мелвином Конвеем [англ.] и в 1964 году реализована в форме системного вызова в Project Genie [англ.] , откуда заимствована Томпсоном при реализации Unix; позднее вызов включён в стандарт POSIX .

Между процессом-потомком, порождаемым вызовом fork() , и процессом-родителем существуют различия:

PID процесса-потомка отличен от PID процесса-родителя; значению PPID процесса-потомка присваивается значение PID процесса-родителя; процесс-потомок получает собственную таблицу файловых дескрипторов, являющуюся копией таблицы процесса-родителя на момент вызова fork() ; это означает, что открытые файлы наследуются, но если процесс-потомок, например, закроет какой-либо файл, то это не повлияет на таблицу дескрипторов процесса-родителя; для процесса-потомка очищаются все ожидающие доставки сигналы ; временная статистика выполнения процесса-потомка в таблицах ОС обнуляется; блокировки памяти и записи, установленные в процессе-родителе, не наследуются.

После вызова fork() алгоритм обычно разветвляется (в случае успешного выполнения функции fork() она возвращает PID процесса-потомка родительскому процессу и нуль — процессу-потомку. Если порождение процесса-потомка закончилось неудачей, функция fork() возвращает значение −1).

После fork() процесс-потомок чаще всего выполняет системный вызов exec () , загружающий в пространство процесса новую программу (именно так, и только так, в Unix-системе выполняется запуск программы в отдельном процессе). Так, первый (нулевой) процесс Unix (ядро системы) создаёт свою копию, чтобы запустить init (процесс с PID = 1), который в свою очередь создаёт дочерние процессы для запуска инициализации системы и терминалов.

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

Вызов fork() выполняется довольно долго, так как требует копирования большого количества данных. Для того чтобы это обойти, некоторые сетевые серверы (например, веб-серверы Apache и Lighttpd ) создают дочерние процессы заранее, чтобы уменьшить время отклика сервера. Также существуют «облегчённые» реализации fork() (например, в ядре Linux [ 1 ] ), отображающие в новый процесс страницы памяти родительского вместо того, чтобы их копировать (новая страница создаётся только при изменении её содержимого одним из процессов), что существенно снижает время создания нового процесса (техника copy-on-write ).

См. также

[ править | править код ] fork-бомба Fork–exec

Примечания

[ править | править код ] OpenNet — fork (неопр.) . Дата обращения: 11 июня 2012. Архивировано 4 марта 2016 года.

Ссылки

[ править | править код ] Спецификация fork() в Единой спецификации UNIX на сайте The Open Group (англ.) Источник — https://ru.wikipedia.org/w/index.php?title=Fork&oldid=128829170 Категории : POSIX C POSIX library Системные вызовы Скрытая категория: Википедия:Cite web (не указан язык)

Навигация

Персональные инструменты

Вы не представились системе Обсуждение Вклад Создать учётную запись Войти

Пространства имён

Статья Обсуждение русский

Просмотры

Читать Править Править код История Ещё

Поиск

Навигация

Заглавная страница Содержание Избранные статьи Случайная статья Текущие события Пожертвовать

Участие

Сообщить об ошибке Как править статьи Сообщество Форум Справка Свежие правки Новые страницы Служебные страницы

Инструменты

Ссылки сюда Связанные правки Постоянная ссылка Сведения о странице Цитировать страницу Получить короткий URL Скачать QR-код

Печать/экспорт

Скачать как PDF Версия для печати

В других проектах

Элемент Викиданных

На других языках

Català Čeština Deutsch English Español Euskara فارسی Français Italiano 日本語 한국어 Монгол Nederlands Norsk bokmål Polski Svenska Українська Tiếng Việt 中文 Править ссылки Эта страница в последний раз была отредактирована 1 марта 2023 в 02:52. Текст доступен по лицензии Creative Commons «С указанием авторства — С сохранением условий» (CC BY-SA) ; в отдельных случаях могут действовать дополнительные условия. Подробнее см. Условия использования .
Wikipedia® — зарегистрированный товарный знак некоммерческой организации «Фонд Викимедиа» (Wikimedia Foundation, Inc.) Политика конфиденциальности Описание Википедии Отказ от ответственности Свяжитесь с нами Кодекс поведения Разработчики Статистика Заявление о куки Мобильная версия
Posted 28 Comments