fork
1. fork.2.man
Manpage of FORK
FORK
Section: Руководство программиста Linux (2)Updated: 2009-04-27
Index Return to Main Contents
ИМЯ
fork - создаёт дочерний процессОБЗОР
#include <unistd.h>ОПИСАНИЕ
Вызов fork() создает новый процесс посредством копирования вызывающего процесса. Новый процесс, называемый потомком, является точной копией вызывающего процесса, который называется родительским, за исключением следующих моментов:- *
- Потомок имеет свой уникальный идентификатор процесса, и этот PID (идентификатор процесса) не совпадает ни с одним существующим идентификатором группы процессов (setpgid(2)).
- *
- Идентификатор родительского процесса у потомка равен идентификатору родительского процесса.
- *
- Потомок не наследует блокировки памяти родителя (mlock(2), mlockall(2)).
- *
- Счётчики использования ресурсов (getrusage(2)) и времени ЦП у потомка сброшены в 0.
- *
- Набор ожидающих сигналов потомка изначально пуст (sigpending(2)).
- *
- Потомок не наследует значения семафоров родителя (semop(2)).
- *
- Потомок не наследует блокировочные записи родителя (fcntl(2)).
- *
- Потомок не наследует таймеры родителя (setitimer(2), alarm(2), timer_create(2)).
- *
- Потомок не наследует ожидающие выполнения операции асинхронного ввода-вывода (aio_read(3), aio_write(3)) и контексты асинхронного ввода-вывода родителя (см. io_setup(2)).
Все перечисленные атрибуты указаны в POSIX.1-2001. Родитель и потомок также отличаются по следующим атрибутам процесса, которые есть только в Linux:
- *
- Потомок не наследует уведомления об изменении каталога (dnotify) родителя (смотрите описание F_NOTIFY в fcntl(2)).
- *
- Настройка PR_SET_PDEATHSIG у prctl(2) сбрасывается, и поэтому потомок не принимает сигнал о завершении работы родителя.
- *
- Отображение памяти, помеченное с помощью флага MADV_DONTFORK через madvise(2), при fork() не наследуется.
- *
- Сигнал завершения работы потомка всегда SIGCHLD (см. clone(2)).
Также стоит учитывать следующее:
- *
- Процесс потомка создаётся с одиночной нитью --- той, которая вызвала fork(). Всё виртуальное адресное пространство родителя копируется в потомок, включая состояние мьютексов, условных переменных и других объектов pthreads; в случае проблем с этим может помочь pthread_atfork(3).
- *
- Потомок наследует копии набора открытых файловых дескрипторов родителя. Каждый файловый дескриптор в потомке ссылается на то же описание файла что и родитель (см. open(2)). Это означает, что два дескриптора совместно используют флаги состояния открытого файла, текущее смещение файла и атрибуты ввода-вывода, управляемые сигналами (смотрите описание F_SETOWN и F_SETSIG в fcntl(2)).
- *
- Потомок наследует копии набора дескрипторов открытых очередей сообщений родителя (см. mq_overview(7)). Каждый дескриптор в потомке ссылается на то же описание открытой очереди сообщений что и родитель. Это означает, что два дескриптора совместно используют флаги (mq_flags).
- *
- Потомок наследует копии набора потоков открытых каталогов родителя (см. opendir(3)). В POSIX.1-2001 сказано, что соответствующие потоки каталогов в родителе и потомке могут совместно использовать позицию в потоке каталога; в Linux/glibc они не могут этого делать.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном завершении родителю возвращается PID процесса-потомка, а процессу-потомку возвращается 0. При ошибке родительскому процессу возвращается -1, процесс-потомок не создаётся, а значение errno устанавливается в соответствующее значение.ОШИБКИ
- EAGAIN
- Вызов fork() завершился с ошибкой из-за невозможности выделить достаточно памяти для копирования таблиц страниц родителя и для выделения структуры описания процесса-потомка.
- EAGAIN
- Невозможно создать новый процесс, так как вызывающий исчерпал ресурс RLIMIT_NPROC. Чтобы превысить этот предел, процесс должен иметь мандат CAP_SYS_ADMIN или CAP_SYS_RESOURCE.
- ENOMEM
- Вызов fork() завершился с ошибкой из-за невозможности разместить необходимые структуры ядра, потому что слишком мало памяти.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.3BSD, POSIX.1-2001.ЗАМЕЧАНИЯ
В Linux, fork() реализован с помощью "копирования страниц при записи" (copy-on-write, COW), поэтому расходы на вызов состоят из времени и памяти, требуемой на копирование страничных таблиц родителя и создания уникальной структуры, описывающей задачу.
Начиная с версии 2.3.3, вместо того, чтобы вызывать системный вызов fork(), обёрточная функция fork() в glibc, как часть реализации нитей NPTL, вызывает clone(2) с флагами, которые обеспечивают поведение традиционного системного вызова. Обёртка в glibc вызывает все обработчики при ветвлении (fork), которые были зарегистрированы с помощью pthread_atfork(3).
ПРИМЕР
Смотрите pipe(2) и wait(2).СМОТРИТЕ ТАКЖЕ
clone(2), execve(2), setrlimit(2), unshare(2), vfork(2), wait(2), daemon(3), capabilities(7), credentials(7)
Index
- ИМЯ
- ОБЗОР
- ОПИСАНИЕ
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- ЗАМЕЧАНИЯ
- ПРИМЕР
- СМОТРИТЕ ТАКЖЕ
This document was created by man2html using the manual pages.
Time: 17:16:27 GMT, January 19, 2012




