.\" -*- coding: UTF-8 -*-
.\" Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\" 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 <mtk.manpages@gmail.com>
.\"     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 "3 maja 2023 r." "Linux man\-pages 6.05.01" 
.SH NAZWA
fork \- tworzy proces potomny
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <unistd.h>\fP
.PP
\fBpid_t fork(void);\fP
.fi
.SH OPIS
\fBfork\fP() tworzy nowy proces, duplikując proces wywołujący. Nowy proces jest
nazywany procesem \fIpotomnym\fP (lub dzieckiem). Proces wywołujący jest
nazywany procesem \fImacierzystym\fP (lub rodzicem).
.PP
Proces potomny i proces macierzysty działają w oddzielnych rejonach
pamięci. W momencie wykonania \fBfork\fP() oba rejony pamięci mają taką samą
zawartość. Zapisy do pamięci, przypisywania (\fBmmap\fP(2)) i odmapowywania
(\fBmunmap\fP(2)) pliku wykonane wobec jednego z procesów nie mają wpływu na
drugi.
.PP
Proces potomny jest dokładną kopią procesu macierzystego z wyłączeniem
następujących punktów:
.IP \[bu] 3
Proces potomny ma swój unikatowy identyfikator procesu i nie pasuje ono do
identyfikatora żadnej istniejącej sesji lub grupy (\fBsetpgid\fP(2)) procesu.
.IP \[bu]
Identyfikator procesu macierzystego dla procesu potomnego jest taki sam jak
identyfikator procesu macierzystego.
.IP \[bu]
Proces potomny nie dziedziczy blokad pamięci swojego procesu macierzystego
(\fBmlock\fP(2), \fBmlockall\fP(2)).
.IP \[bu]
Użycie zasobów procesu (\fBgetrusage\fP(2)) i liczniki czasu procesora
(\fBtimes\fP(2)) są resetowane do zera dla procesu potomnego.
.IP \[bu]
Zestaw oczekujących sygnałów dla procesu potomnego jest początkowo pusty
(\fBsigpending\fP(2)).
.IP \[bu]
Proces potomny nie dziedziczy dostosowań semaforów od procesu macierzystego
(\fBsemop\fP(2)).
.IP \[bu]
Proces potomny nie dziedziczy blokad rekordów związanych z procesem od
swojego procesu macierzystego (\fBfcntl\fP(2)) (z drugiej strony dziedziczy
blokady opisu otwartego pliku (OFD) \fBfcntl\fP(2) oraz blokady \fBflock\fP(2) od
swojego procesu macierzystego).
.IP \[bu]
Proces potomny nie dziedziczy czasomierzy od swojego procesu macierzystego
(\fBsetitimer\fP(2), \fBalarm\fP(2), \fBtimer_create\fP(2)).
.IP \[bu]
Proces potomny nie dziedziczy zaległych, asynchronicznych operacji
wejścia/wyjścia od procesu macierzystego (\fBaio_read\fP(3), \fBaio_write\fP(3)),
ani nie dziedziczy żadnego kontekstu asynchronicznego wejścia/wyjścia od
procesu macierzystego (zob. \fBio_setup\fP(2)).
.PP
Atrybuty procesu w powyższej liście są określone w normie POSIX.1. Proces
macierzysty i potomny będą się różnić również w odniesieniu do
następujących, typowo linuksowych atrybutów procesu:
.IP \[bu] 3
Proces potomny nie odziedziczy notyfikacji o zmianie katalogu (dnotify) od
swojego rodzica (więcej informacji w opisie \fBF_NOTIFY\fP w podręczniku
\fBfcntl\fP(2)).
.IP \[bu]
Ustawienie \fBPR_SET_PDEATHSIG\fP \fBprctl\fP(2) jest resetowane, dzięki czemu
proces potomny nie otrzyma sygnału, gdy jego proces macierzysty ulegnie
zakończeniu.
.IP \[bu]
Domyślna wartość luzu czasomierza jest ustawiana na aktualną wartość luzu
czasomierza procesu macierzystego. Więcej informacji w opisie
\fBPR_SET_TIMERSLACK\fP w podręczniku \fBprctl\fP(2).
.IP \[bu]
Przypisania pamięci oznaczone znacznikiem \fBMADV_DONTFORK\fP \fBmadvise\fP(2),
nie są dziedziczone poprzez \fBfork\fP().
.IP \[bu]
Pamięć w przedziałach adresowych oznaczonych znacznikiem \fBMADV_WIPEONFORK\fP
\fBmadvise\fP(2) jest zerowana dla procesu potomnego, po wykonaniu \fBfork\fP()
(ustawienie \fBMADV_WIPEONFORK\fP nie ulega zmianie dla tych przedziałów
adresowych, dla procesu potomnego).
.IP \[bu]
Sygnałem przerwania procesu potomnego jest zawsze \fBSIGCHLD\fP
(zob. \fBclone\fP(2)).
.IP \[bu]
Bity uprawnień dostępu do portu ustawione za pomocą \fBioperm\fP(2) nie są
dziedziczone przez proces potomny; musi on sam włączyć wszystkie wymagane
bity przy użyciu \fBioperm\fP(2).
.PP
Dalsze uwagi:
.IP \[bu] 3
Proces potomny jest tworzony jednym wątkiem \[em] tym który wywołał
\fBfork\fP(). Cała wirtualna przestrzeń adresowa jest replikowana dla procesu
potomnego; obejmuje to zatrzaski (muteksy), zmienne warunkowe i inne obiekty
pthread; podręcznik \fBpthread_atfork\fP(3) może okazać się przydatny w
radzeniu sobie z problemami, jakie to może spowodować.
.IP \[bu]
W programie wielowątkowym, po \fBfork\fP() proces potomny może bezpiecznie
wykonać jedynie funkcje które są async\-signal\-safe
(zob. \fBsignal\-safety\fP(7)) aż do momentu, gdy nie wywoła \fBexecve\fP(2).
.IP \[bu]
Proces potomny dziedziczy kopie zestawu deskryptorów otwartego pliku. Każdy
deskryptor pliku procesu potomnego odnosi się do tego samego opisu otwartego
pliku (OFD, zob. \fBopen\fP(2)) jako deskryptor odpowiadającego pliku swego
procesu macierzystego. Oznacza to, że dwa deskryptory pliku dzielą znaczniki
statusu otwartego pliku, przesunięcia pliku oraz atrybuty wejście/wyjścia
zasilane sygnałami (zob. opis \fBF_SETOWN\fP i \fBF_SETSIG\fP w \fBfcntl\fP(2)).
.IP \[bu]
Proces potomny dziedziczy zestaw deskryptorów otwartej kolejki komunikatów
procesu macierzystego (zob. \fBmq_overview\fP(7)). Każdy deskryptor w procesie
potomnym odnosi się do tego samego opisu kolejki otwartego komunikatu, jak
odpowiadający deskryptor pliku procesu macierzystego. Oznacza to, że dwa
deskryptory pliku dzielą te same znaczniki (\fImq_flags\fP).
.IP \[bu]
Proces potomny kopiuje zestaw strumieni otwartego katalogu procesu
macierzystego (zob. \fBopendir\fP(3)).  POSIX.1 wskazuje, że odpowiadające
strumienie katalogów procesu macierzystego i potomnego \fImogą\fP dzielić
pozycjonowanie strumienia katalogu, w Linuksie/glibc tak się nie dzieje.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu, w procesie macierzystym zwracany jest PID procesu
potomnego, a w procesie potomnym zwracane jest 0. Po błędzie zwracane jest
\-1 do procesu macierzystego, nie jest tworzony procesie potomny i
odpowiednio ustawiane jest \fIerrno\fP wskazując błąd.
.SH BŁĘDY
.TP 
\fBEAGAIN\fP
.\" NOTE! The following should match the description in pthread_create(3)
Napotkano nałożony systemowo limit liczby wątków. Występuje wiele limitów,
które mogą wyzwolić ten błąd:
.RS
.IP \[bu] 3
osiągnięto miękki limit zasobów \fBRLIMIT_NPROC\fP (ustawiany za pomocą
\fBsetrlimit\fP(2)), który ogranicza liczbę procesów i wątków dla rzeczywistego
identyfikatora użytkownika;
.IP \[bu]
osiągnięto systemowy limit jądra na liczbę procesów i wątków
\fI/proc/sys/kernel/threads\-max\fP (zob. \fBproc\fP(5));
.IP \[bu]
osiągnięto maksymalną liczbę identyfikatorów procesów
\fI/proc/sys/kernel/pid_max\fP (zob. \fBproc\fP(5)); albo
.IP \[bu]
osiągnięto limit identyfikatorów procesów (\fIpids.max\fP) nałożony przez
kontroler cgroup \[Bq]liczba procesów\[rq] (PID\-ów).
.RE
.TP 
\fBEAGAIN\fP
Wywołanie działa według zasad planisty \fBSCHED_DEADLINE\fP i nie posiada
znacznika zresetuj\-przy\-rozwidleniu. Zob. \fBsched\fP(7).
.TP 
\fBENOMEM\fP
\fBfork\fP() nie potrafił zaalokować niezbędnych struktur jądra z powodu
niedostatecznej ilości pamięci.
.TP 
\fBENOMEM\fP
Próbowano utworzyć proces potomny w przestrzeni nazw PID, której proces
\[Bq]init\[rq] uległ zakończeniu. Zob. \fBpid_namespaces\fP(7).
.TP 
\fBENOSYS\fP
.\" e.g., arm (optionally), blackfin, c6x, frv, h8300, microblaze, xtensa
\fBfork\fP() nie jest obsługiwane na tej platformie (np. sprzęt bez jednostki
Memory\-Management Unit).
.TP 
\fBERESTARTNOINTR\fP (od Linuksa 2.6.17)
.\" commit 4a2c7a7837da1b91468e50426066d988050e4d56
Wywołanie systemowe przerwano sygnałem i zostanie ono przeładowane (widać to
tylko przy śledzeniu).
.SH WERSJE
.SS "Różnice biblioteki C/jądra"
.\" nptl/sysdeps/unix/sysv/linux/fork.c
.\" and does some magic to ensure that getpid(2) returns the right value.
Od glibc 2.3.3, zamiast przywoływać wywołanie systemowe jądra \fBfork\fP(),
opakowanie \fBfork\fP() z biblioteki glibc, dostępne jako część implementacji
wątkowania NPTL, przywołuje \fBclone\fP(2) ze znacznikami, zapewniającymi taki
sam efekt, jak tradycyjne wywołanie systemowe (wywołanie \fBfork\fP() jest
równoważne wywołaniu \fBclone\fP(2) przy określeniu \fIflags\fP jako wyłącznie
\fBSIGCHLD\fP). Opakowanie z biblioteki glibc przywołuje procedury obsługi
rozwidlania, które ustanowiono za pomocą \fBpthread_atfork\fP(3).
.SH STANDARDY
POSIX.1\-2008.
.SH HISTORIA
POSIX.1\-2001, SVr4, 4.3BSD.
.SH UWAGI
Pod Linuksem \fBfork\fP() jest zaimplementowane za pomocą kopiowania stron
pamięci przy zapisie, więc jedynymi mankamentami są czas i pamięć wymagane
do powielenia tablic stron rodzica i utworzenia unikalnej struktury zadania
dla potomka.
.SH PRZYKŁADY
Zob. \fBpipe\fP(2) i \fBwait\fP(2), aby obejrzeć więcej przykładów.
.PP
.\" SRC BEGIN (fork.c)
.EX
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
\&
int
main(void)
{
    pid_t pid;
\&
    if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
        perror("sygnał");
        exit(EXIT_FAILURE);
    }
    pid = fork();
    switch (pid) {
    case \-1:
        perror("fork");
        exit(EXIT_FAILURE);
    case 0:
        puts("Proces potomny wychodzi.");
        exit(EXIT_SUCCESS);
    default:
        printf("Proces potomny ma PID %jd\en", (intmax_t) pid);
        puts("Proces macierzysty wychodzi.");
        exit(EXIT_SUCCESS);
    }
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\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 TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
