.\" -*- 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 "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 \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 #include #include #include #include \& 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 , Andrzej Krzysztofowicz i Michał Kułach . .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 .