Provided by: manpages-pl-dev_0.5-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/.