Provided by: manpages-pl-dev_0.7-1_all bug

NAZWA

       clone - utworzenie procesu potomnego

SKŁADNIA

       #include <sched.h>

       int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

       _syscall2(int, clone, int, flags, void *, child_stack)

OPIS

        Uwaga! To tłumaczenie może być nieaktualne!

       clone  tworzy nowy proces, podobnie jak fork(2).  clone jest funkcją biblioteczną posadowioną na wierzchu
       niższego wywołania funkcji systemowej clone, do której w dalszym  ciągu  będziemy  się  odnosić  jako  do
       sys_clone.  Opis sys_clone jest podany pod koniec niniejszej strony.

       W  odróżnieniu  od  fork(2),  funkcje  te  pozwalają  procesom potomnym współdzielić części ich kontekstu
       wykonania, takie jak obszar pamięci, tablica deskryptorów plików czy tablica programów obsługi  sygnałów,
       z  procesem  wywołującym.  (Należy  zauważyć, że na tej stronie podręcznika "proces wywołujący" normalnie
       odnosi się do "procesu macierzystego". Zobacz opis CLONE_PARENT poniżej.)

       clone służy głównie do  implementacji  wątków:  zarządzanie  wieloma  wątkami  programu,  które  działają
       równolegle we współdzielonym obszarze pamięci.

       Gdy  za  pomocą clone tworzony jest proces potomny, uruchamia on aplikację funkcyjną fn(arg).  (Różni się
       to od fork(2), gdzie proces potomny kontynuuje wykonanie od miejsca wywołania fork(2).)  Argument fn jest
       wskaźnikiem  do funkcji, która jest wywoływana przez proces potomny na początku jego działania.  Argument
       arg jest przekazywany do funkcji fn.

       Gdy aplikacja funkcyjna fn(arg) powróci, proces potomny kończy działanie. Liczba całkowita zwrócona przez
       fn  jest  kodem  zakończenia  procesu potomnego. Proces potomny może również zakończyć się jawnie wołając
       exit(2) lub po otrzymaniu krytycznego sygnału.

       Argument child_stack określa położenie stosu używanego przez proces potomny.  Ponieważ potomek  i  proces
       wywołujący  mogą współdzielić pamięć, nie jest możliwe, aby proces potomny korzystał z tego samego stosu,
       co proces wywołujący. Proces wywołujący musi więc przydzielić obszar pamięci przeznaczony na stos potomka
       i  przekazać  wskaźnik  do tego obszaru w clone.  Stosy rosną w dół na wszystkich procesorach, na których
       działa Linux (z wyjątkiem procesorów HP PA), więc  child_stack  zazwyczaj  wskazuje  na  najwyższy  adres
       obszaru pamięci zarezerwowanego na stos potomka.

       Niższy bajt flags zawiera numer sygnału wysyłanego do rodzica, gdy proces potomny ginie.  Jeśli określono
       inny sygnał niż SIGCHLD, to proces macierzysty musi podać opcję __WALL lub __WCLONE czekając na potmka  w
       wait(2).   Gdy  sygnał  nie  zostanie  określony,  to  proces  macierzysty  nie  zostanie  zawiadomiony o
       zakończeniu pracy potomka.

       flags może również być bitowym OR  jednej  lub  kilku  następujących  stałych  określających,  co  będzie
       współdzielone pomiędzy procesem wywołującym a procesem potomnym:

       CLONE_PARENT
              (od  Linuksa  2.4  w górę) Jeśli CLONE_PARENT będzie ustawione, to rodzic nowego procesu potomnego
              (zwrócony przez getppid(2)) będzie ten sam, co dla procesu wywołującego.

              Jeśli CLONE_PARENT nie zostanie ustawione, to (jak dla fork(2))  rodzicem  potomka  będzie  proces
              wywołujący.

              Należy  zauważyć,  że  to  proces  macierzysty, zwracany przez getppid(2), zostanie powiadomiony o
              zakończeniu pracy przez  potomka,  więc  jeśli  CLONE_PARENT  będzie  ustawione,  to  zawiadomiony
              zostanie rodzic procesu wywołującego, a nie sam proces wywołujący

       CLONE_FS
              Jeśli  ustawione  będzie  CLONE_FS,  to wywołujący i proces potomny będą współdzielić informacje o
              systemie plików. Informacje te obejmują katalog główny systemu plików, bieżący katalog  roboczy  i
              umaskę.  Dowolne  z  wywołań chroot(2), chdir(2) lub umask(2) wykonane przez proces wywołujący lub
              proces potomny będzie obowiązywać również w drugim procesie.

              Jeśli CLONE_FS nie zostanie ustawione, to proces potomny będzie pracować  na  kopii  informacji  o
              systemie  plików  procesu  wywołującego  z chwili wywołania clone.  Wywołania chroot(2), chdir(2),
              umask(2) wykonane później przez jeden z procesów nie będą mieć wpływu na drugi proces.

       CLONE_FILES
              Jeśli CLONE_FILES będzie ustawione, to proces  wywołujący  i  procesy  potomne  będą  współdzielić
              tablicę deskryptorów plików. Deskryptory plików zawsze będą dotyczyć tych samych plików w procesie
              wywołującym i w procesach potomnych. Dowolny deskryptor pliku utworzony przez  proces  wywołujący,
              jak też przez proces potomny będzie obowiązywać również w drugim procesie. Podobnie, jeśli jeden z
              procesów zamknie deskryptor pliku lub zmieni stowarzyszone z nim znaczniki, będzie to  obowiązywać
              również w drugim procesie.

              If CLONE_FILES nie zostanie ustawione, to proces potomny odziedziczy kopię wszystkich deskryptorów
              plików otwartych w procesie macierzystym w chwili  wywołania  clone.   Operacje  na  deskryptorach
              plików  przeprowadzone  później  przez  proces  wywołujący lub przez proces potomny nie będą miały
              wpływu na drugi proces.

       CLONE_NEWNS
              (począwszy od Linuksa 2.4.19) Uruchamianie procesu potomnego w nowej przestrzeni nazw.

              Każdy proces istnieje w jakiejś przestrzeni nazw.  przestrzeń  nazw  procesu  są  to  dane  (zbiór
              montowań)  opisujące  hierarchię  plików  widzianą  przez proces. Po fork(2) lub clone(2), gdy nie
              ustawiono znacznika CLONE_NEWNS, potomek żyje w tej samej przestrzeni nazw,  co  rodzic.   Funkcje
              systemowe  mount(2)  i  umount(2)  zmieniają  przestrzeń  nazw procesu wywołującego, a zatem także
              innych procesów żyjących w tej samej przestrzeni nazw, lecz nie mają wpływu  na  procesy  w  innej
              przestrzeni nazw.

              Po  clone(2),  gdy  ustawiono  znacznik  CLONE_NEWNS,  sklonowany potomek jest uruchamiany w nowej
              przestrzeni nazw, inicjowanej jako kopia przestrzeni nazw rodzica.

              Znacznik CLONE_NEWNS może zostać podany jedynie przez  proces  uprzywilejowany.   Zabronione  jest
              podanie w tym samym wywołaniu clone zarówno CLONE_NEWNS, jak i CLONE_FS.

       CLONE_SIGHAND
              Jeśli  CLONE_SIGHAND  będzie  ustawione,  to proces wywołujący i procesy potomne będą współdzielić
              tablicę  programów  obsługi  sygnałów.  Jeśli  proces  wywołujący  lub   proces   potomny   wywoła
              sigaction(2),  aby  zmienić  zachowanie  towarzyszące  sygnałowi, zachowanie to zostanie zmienione
              również w drugim procesie. Jednakże, proces wywołujący i proces potomny wciąż będą posiadać osobne
              maski  sygnałów i zestawy sygnałów oczekujących. Zatem jeden z nich może zablokować lub odblokować
              niektóre sygnały za pomocą sigprocmask(2) nie wpływajac na drugi proces.

              Jeśli CLONE_SIGHAND nie zostanie ustawione, to proces potomny odziedziczy kopię programów  obsługi
              sygnałów   od   procesu   wywołującego   z  chwili  uruchomienia  clone.   Wywołania  sigaction(2)
              przeprowadzone później przez jeden z procesów nie będą mieć wpływu na drugi proces.

       CLONE_PTRACE
              Jeśli zostanie podane CLONE_PTRACE, a proces wywołujący  będzie  śledzony,  to  śledzenie  obejmie
              również potomka (zobacz ptrace(2)).

       CLONE_VFORK
              Jeśli  CLONE_VFORK  będzie  ustawione,  wykonywanie  procesu  wywołującego  zostanie wstrzymane do
              chwili, gdy potomek zwolni swoją pamięć wirtualną za  pomocą  execve(2)  lub  _exit(2)  (jak  przy
              vfork(2)).

              Jeśli CLONE_VFORK nie zostanie ustawione, wtedy zarówno proces wywołujący, jak i potomny podlegają
              po wywołaniu clone szeregowaniu zadań i aplikacja nie może zakładać, że ich wykonywanie będzie się
              odbywać w określonej kolejności.

       CLONE_VM
              Jeśli  CLONE_VM będzie ustawione, to proces wywołujący i potomny będą działać w tym samym obszarze
              pamięci. W szczególności, zapisy do pamięci wykonywane przez proces wywołujący  lub  przez  proces
              potomny  będą  widoczne  dla  drugiego z procesów.  Ponadto, dowolne mapowania pamięci i usunięcia
              mapowań wykonane przez jeden z tych procesów za pomocą mmap(2) lub munmap(2) będą dotyczyć również
              drugiego procesu.

              Jeśli  CLONE_VM  nie  zostanie ustawione, to proces potomny będzie działać w kopii obszaru pamięci
              procesu wywołującego, wykonanej w chwili wywołania clone.  Zapisy  do  pamięci  oraz  mapowania  i
              usunięcia  mapowań wykonane przez jeden z tych procesów nie będą dotyczyć drugiego z nich, tak jak
              w przypadku fork(2).

       CLONE_PID
              Jeśli CLONE_PID będzie ustawione, to proces potomny będzie tworzony z tym samym ID  procesu,  jaki
              ma proces wywołujący.

              Jeśli  CLONE_PID  nie  zostanie ustawione, to proces potomny będzie mieć unikalny ID procesu, inny
              niż ID procesu wywołującego.

              Ten znacznik może być podany tylko przez proces uruchamiający system (PID 0).

       CLONE_THREAD
              (Począwszy od Linuksa 2.4) Jeśli CLONE_THREAD będzie ustawione, to potomek  będzie  umieszczony  w
              tej samej grupie wątków, do której należy proces wywołujący.

              Jeśli  CLONE_THREAD nie zostanie ustawione, to potomek będzie umieszczony w swojej własnej (nowej)
              grupie wątków, której ID jest taki sam, jak ID procesu.

              (Grupy wątków zostały dodane w Linuksie 2.4 dla obsługiwać wątki  POSIX-owe  dla  zbioru  procesów
              współdzielących  ten  sam PID. W Linuksie 2.4 wywołania funkcji getpid(2) zwracają ID grupy wątków
              procesu wywołującego.)

       Funkcja systemowa sys_clone odpowiada w sposób bardziej zbliżony  funkcji  fork(2),  w  której  wykonanie
       procesu  potomnego  jest  kontynuowane  od miejsca wywołania.  Zatem, sys_clone wymaga jedynie argumentów
       flags i child_stack, które mają znaczenie takie samo, jak dla clone.  (Należy zauważyć, że kolejność tych
       argumentów jest inna aniżeli dla clone.)

       Inna  różnicą  w  przypadku  sys_clone  jest to, że argument child_stack może być zerem. W tym przypadku,
       semantyka "kopiowania podczas zapisu" gwarantuje, że proces  potomny  otrzyma  osobną  kopię  stosu,  gdy
       którykolwiek  z  procesów  zmodyfikuje  stos. W tym przypadku aby funkcja działała prawidłowo, nie należy
       podawać opcji CLONE_VM.

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu, w wątku rodzica zwracany jest PID  potomka.   W  wypadku  błędu,  w  kontekście
       procesu  wywołującego  zwracane  jest -1, a proces potomny nie jest tworzony i odpowiednio ustawiane jest
       errno .

BŁĘDY

       EAGAIN Działa już zbyt wiele procesów.

       ENOMEM Za mało pamięci aby  przydzielić  struktuę  zadania  dla  procesu  potomnego,  lub  aby  skopiować
              niezbędne fragmenty kontekstu procesu wywołującego.

       EINVAL Zwracane przez clone, gdy podano dla child_stack wartość zerową.

       EINVAL W flags podano jednocześnie CLONE_FS i CLONE_NEWNS.

       EINVAL Podano CLONE_THREAD a nie podano CLONE_SIGHAND.  (Począwszy od Linuksa 2.5.35.)

       EPERM  CLONE_PID zostało podane przez proces o niezerowym PID.

USTERKI

       Dla  wersji  jądra  2.1.97  nie  należy  używać  znacznika  CLONE_PID, gdyż inne części jądra i większość
       oprogramowania systemowego wcąż zakłada, że identyfikatory procesów są unikalne.

       Brak wpisu dla clone w wersji 5 biblioteki libc. libc 6 (inaczej, glibc 2)  udostępnia  clone  zgodnie  z
       opisem na niniejszej stronie podręcznika.

UWAGI

       Dla wersji jądra 2.4.7-2.4.18 znacznik CLONE_THREAD wymuszał znacznik CLONE_PARENT.

ZGODNE Z

       Funkcje  clone i sys_clone są specyficzne dla Linuksa i nie powinny być używane w programach przenośnych.
       Pisząc programy aplikacji wielowątkowych (wiele wątków zarządzających tym samym obszarem pamięci), lepiej
       używać  biblioteki  wspomagającej  wielowątkowe  API  zgodne  z  POSIX  1003.1c,  takiej  jak  biblioteka
       LinuxThreads (zawarta w glibc2). Zobacz pthread_create(3).

       Ta strona podręcznika dotyczy jąder 2.0.x, 2.1.x, 2.2.x, 2.4.x, oraz glibc 2.0.x i 2.1.x.

ZOBACZ TAKŻE

       fork(2) wait(2), pthread_create(3)

INFORMACJE O TŁUMACZENIU

       Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne.
       W  razie  zauważenia  różnic  między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
       funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:

              man --locale=C 2 clone

       Prosimy  o  pomoc  w  aktualizacji  stron  man  -   więcej   informacji   można   znaleźć   pod   adresem
       http://sourceforge.net/projects/manpages-pl/.