clone

CLONE(2)                PodrÄcznik programisty Linuksa                CLONE(2)



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/.



Linux 2.4                         2001-12-31                          CLONE(2)