.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2006 Michael Kerrisk .\" A few fragments remain from an earlier (1992) page by .\" Drew Eckhardt (drew@cs.colorado.edu), .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified by Michael Haardt (michael@moria.de) .\" Modified Sat Jul 24 13:22:07 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 21 Aug 1994 by Michael Chastain (mec@shell.portal.com): .\" Referenced 'clone(2)'. .\" Modified 1995-06-10, 1996-04-18, 1999-11-01, 2000-12-24 .\" by Andries Brouwer (aeb@cwi.nl) .\" Modified, 27 May 2004, Michael Kerrisk .\" Added notes on capability requirements .\" 2006-09-04, Michael Kerrisk .\" Greatly expanded, to describe all attributes that differ .\" parent and child. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH fork 2 "2 мая 2024 г." "Linux man\-pages 6.8" .SH ИМЯ fork \- создаёт дочерний процесс .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBpid_t fork(void);\fP .fi .SH ОПИСАНИЕ Вызов \fBfork\fP() создаёт новый процесс посредством копирования вызывающего процесса. Новый процесс считается \fIдочерним\fP процессом. Вызывающий процесс считается \fIродительским\fP процессом. .P Дочерний и родительский процессы находятся в отдельных пространствах памяти. Сразу после \fBfork\fP() эти пространства имеют одинаковое содержимое. Запись в память, отображение файлов (\fBmmap\fP(2)) и снятие отображения (\fBmunmap\fP(2)), выполненных в одном процессе, ничего не изменяет в другом. .P Дочерний процесс является точной копией родительского процесса за исключением следующих моментов: .IP \[bu] 3 Потомок имеет свой уникальный идентификатор процесса, и этот PID (идентификатор процесса) не совпадает ни с одним существующим идентификатором группы процессов (\fBsetpgid\fP(2)) или сеансов. .IP \[bu] Идентификатор родительского процесса у потомка равен идентификатору родительского процесса. .IP \[bu] Потомок не наследует блокировки памяти родителя (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP \[bu] Счётчики использования ресурсов (\fBgetrusage\fP(2)) и времени ЦП у потомка сброшены в 0. .IP \[bu] Набор ожидающих сигналов потомка изначально пуст (\fBsigpending\fP(2)). .IP \[bu] Потомок не наследует значения семафоров родителя (\fBsemop\fP(2)). .IP \[bu] Потомок не наследует связанные с процессом блокировки родителя (\fBfcntl\fP(2)) (с другой стороны, он наследует блокировки файловых описаний \fBfcntl\fP(2) и блокировки \fBflock\fP(2)). .IP \[bu] Потомок не наследует таймеры родителя (\fBsetitimer\fP(2), \fBalarm\fP(2), \fBtimer_create\fP(2)). .IP \[bu] Потомок не наследует ожидающие выполнения операции асинхронного ввода\-вывода (\fBaio_read\fP(3), \fBaio_write\fP(3)) и контексты асинхронного ввода\-вывода родителя (см. \fBio_setup\fP(2)). .P Все перечисленные атрибуты указаны в POSIX.1. Родитель и потомок также отличаются по следующим атрибутам процесса, которые есть только в Linux: .IP \[bu] 3 Потомок не наследует уведомления об изменении каталога (dnotify) родителя (смотрите описание \fBF_NOTIFY\fP в \fBfcntl\fP(2)). .IP \[bu] Настройка \fBPR_SET_PDEATHSIG\fP у \fBprctl\fP(2) сбрасывается, и поэтому потомок не принимает сигнал о завершении работы родителя. .IP \[bu] Резервное значение по умолчанию устанавливается равным родительскому текущему резервному значению таймера. Смотрите описание \fBPR_SET_TIMERSLACK\fP в \fBprctl\fP(2). .IP \[bu] Отображение памяти, помеченное с помощью флага \fBMADV_DONTFORK\fP через \fBmadvise\fP(2), при \fBfork\fP() не наследуется. .IP \[bu] Память в диапазонах адресов, которые были помечены с помощью \fBmadvise\fP(2) флагом \fBMADV_WIPEONFORK\fP, обнуляются в потомке после \fBfork\fP() (флаг \fBMADV_WIPEONFORK\fP остаётся в потомке у этих диапазонов адресов). .IP \[bu] Сигнал завершения работы потомка всегда \fBSIGCHLD\fP (см. \fBclone\fP(2)). .IP \[bu] Биты прав доступа к порту, установленные с помощью \fBioperm\fP(2), не наследуются потомком; потомок должен установить все нужные ему биты с помощью \fBioperm\fP(2). .P Также стоит учитывать следующее: .IP \[bu] 3 The child process is created with a single thread\[em]the one that called \fBfork\fP(). The entire virtual address space of the parent is replicated in the child, including the states of mutexes, condition variables, and other pthreads objects; the use of \fBpthread_atfork\fP(3) may be helpful for dealing with problems that this can cause. .IP \[bu] В многонитевой программе после \fBfork\fP() потомок может безопасно вызывать только безопасные\-асинхронные\-сигнальные функции (смотрите \fBsignal\-safety\fP(7)) до тех пор, пока не вызовет \fBexecve\fP(2). .IP \[bu] Потомок наследует копии набора открытых файловых дескрипторов родителя. Каждый файловый дескриптор в потомке ссылается на то же описание файла что и родитель (смотрите \fBopen\fP(2)). Это означает, что два файловых дескриптора совместно используют флаги состояния открытого файла, смещение файла и атрибуты ввода\-вывода, управляемые сигналами (смотрите описание \fBF_SETOWN\fP и \fBF_SETSIG\fP в \fBfcntl\fP(2)). .IP \[bu] Потомок наследует копии набора файловых дескрипторов открытых очередей сообщений родителя (смотрите \fBmq_overview\fP(7)). Каждый файловый дескриптор в потомке ссылается на то же описание открытой очереди сообщений что и родитель. Это означает, что два файловых дескриптора совместно используют флаги (\fImq_flags\fP). .IP \[bu] Потомок наследует копии набора потоков открытых каталогов родителя (смотрите \fBopendir\fP(3)). В POSIX.1 сказано, что соответствующие потоки каталогов в родителе и потомке \fIмогут\fP совместно использовать позицию в потоке каталога; в Linux/glibc они не могут этого делать. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, \-1 is returned in the parent, no child process is created, and \fIerrno\fP is set to indicate the error. .SH ОШИБКИ .TP \fBEAGAIN\fP .\" NOTE! The following should match the description in pthread_create(3) Возникло системного ограничение на количество нитей. Есть несколько ограничений, которые могут вызвать эту ошибку: .RS .IP \[bu] 3 \fBRLIMIT_NPROC\fP (задаётся с помощью \fBsetrlimit\fP(2)), который ограничивает количество процессов и ните для реального ID пользователя; .IP \[bu] было достигнуто системное ограничение ядра на количество процессов и нитей, \fI/proc/sys/kernel/threads\-max\fP (смотрите \fBproc\fP(5)); .IP \[bu] достигнуто максимальное количество PID, \fI/proc/sys/kernel/pid_max\fP (смотрите \fBproc\fP(5)); или .IP \[bu] достигнуто ограничение на PID (\fIpids.max\fP), наложенное контроллером cgroup на «номер процесса» (PID). .RE .TP \fBEAGAIN\fP Вызывающий работает по алгоритму планирования \fBSCHED_DEADLINE\fP и у него не установлен флаг сброса\-при\-fork (reset\-on\-fork). Смотрите \fBsched\fP(7). .TP \fBENOMEM\fP Вызов \fBfork\fP() завершился с ошибкой из\-за невозможности разместить необходимые структуры ядра, потому что слишком мало памяти. .TP \fBENOMEM\fP Была попытка создания дочерний процесс в пространстве имён PID, чей процесс «init» завершил работу. Смотрите \fBpid_namespaces\fP(7). .TP \fBENOSYS\fP .\" e.g., arm (optionally), blackfin, c6x, frv, h8300, microblaze, xtensa Вызов \fBfork\fP() не поддерживается на этой платформе (например, из\-за того, что аппаратное обеспечение не содержит блока управления памятью (MMU)). .TP \fBERESTARTNOINTR\fP (начиная с Linux 2.6.17) .\" commit 4a2c7a7837da1b91468e50426066d988050e4d56 Системный вызов был прерван сигналом и перезапущен (может быть замечено только при трассировке). .SH ВЕРСИИ .SS "Отличия между библиотекой C и ядром" .\" nptl/sysdeps/unix/sysv/linux/fork.c .\" and does some magic to ensure that getpid(2) returns the right value. Since glibc 2.3.3, rather than invoking the kernel's \fBfork\fP() system call, the glibc \fBfork\fP() wrapper that is provided as part of the NPTL threading implementation invokes \fBclone\fP(2) with flags that provide the same effect as the traditional system call. (A call to \fBfork\fP() is equivalent to a call to \fBclone\fP(2) specifying \fIflags\fP as just \fBSIGCHLD\fP.) The glibc wrapper invokes any fork handlers that have been established using \fBpthread_atfork\fP(3). .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ POSIX.1\-2001, SVr4, 4.3BSD. .SH ПРИМЕЧАНИЯ В Linux, \fBfork\fP() реализован с помощью «копирования страниц при записи» (copy\-on\-write, COW), поэтому расходы на вызов состоят из времени и памяти, требуемой на копирование страничных таблиц родителя и создания уникальной структуры, описывающей задачу. .SH ПРИМЕРЫ See \fBpipe\fP(2) and \fBwait\fP(2) for more examples. .P .\" SRC BEGIN (fork.c) .EX #include #include #include #include #include #include \& int main(void) { pid_t pid; \& if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } pid = fork(); switch (pid) { case \-1: perror("fork"); exit(EXIT_FAILURE); case 0: puts("Child exiting."); exit(EXIT_SUCCESS); default: printf("Child is PID %jd\en", (intmax_t) pid); puts("Parent exiting."); exit(EXIT_SUCCESS); } } .EE .\" SRC END .SH "СМОТРИТЕ ТАКЖЕ" \fBclone\fP(2), \fBexecve\fP(2), \fBexit\fP(2), \fBsetrlimit\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBwait\fP(2), \fBdaemon\fP(3), \fBpthread_atfork\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал Azamat Hackimov , Dmitry Bolkhovskikh , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .