> Linux Reviews > man >

fork


  1. fork.2.man


1. fork.2.man

Manpage of FORK

FORK

Section: Руководство программиста Linux (2)
Updated: 2009-04-27
Index Return to Main Contents
 

ИМЯ

fork - создаёт дочерний процесс  

ОБЗОР

#include <unistd.h>

pid_t fork(void);  

ОПИСАНИЕ

Вызов 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:41:18 GMT, October 23, 2013

SVENSKA - SVENSKA - SVENSKA - SVENSKA - SVENSKA - ja - nl - pl