Provided by: manpages-pl-dev_20060617-3_all bug

NAZWA

       clone - utworzenie procesu potomnego

SK/LADNIA

       #include <sched.h>

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

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

OPIS

       clone  tworzy  nowy  proces,  podobnie  jak fork(2).  clone jest funkcj
       biblioteczn posadowion na wierzchu niszego wywolania funkcji systemowej
       clone,  do  ktorej  w dalszym cigu bdziemy si odnosi jako do sys_clone.
       Opis sys_clone jest podany pod koniec niniejszej strony.

       W  odronieniu  od  fork(2),  funkcje  te  pozwalaj  procesom   potomnym
       wspoldzieli  czci  ich  kontekstu  wykonania,  takie jak obszar pamici,
       tablica deskryptorow plikow czy tablica programow obslugi  sygnalow,  z
       procesem wywolujcym. (Naley zauway, e na tej stronie podrcznika "proces
       wywolujcy" normalnie odnosi si do "procesu macierzystego". Zobacz  opis
       CLONE_PARENT poniej.)

       clone  sluy  glownie  do implementacji wtkow: zarzdzanie wieloma wtkami
       programu, ktore dzialaj rownolegle we wspoldzielonym obszarze pamici.

       Gdy za pomoc clone tworzony jest proces potomny, uruchamia on  aplikacj
       funkcyjn  fn(arg).   (Roni  si  to  od  fork(2),  gdzie  proces potomny
       kontynuuje wykonanie od miejsca wywolania fork(2).)  Argument  fn  jest
       wskanikiem  do  funkcji,  ktora jest wywolywana przez proces potomny na
       pocztku jego dzialania.  Argument arg jest przekazywany do funkcji fn.

       Gdy  aplikacja  funkcyjna  fn(arg)  powroci,   proces   potomny   koczy
       dzialanie.  Liczba  calkowita  zwrocona  przez fn jest kodem zakoczenia
       procesu potomnego. Proces potomny moe rownie zakoczy si  jawnie  wolajc
       exit(2) lub po otrzymaniu krytycznego sygnalu.

       Argument  child_stack  okrela  poloenie  stosu  uywanego  przez  proces
       potomny.  Poniewa potomek i proces wywolujcy mog wspoldzieli pami,  nie
       jest  moliwe,  aby  proces  potomny  korzystal  z tego samego stosu, co
       proces wywolujcy. Proces wywolujcy musi wic  przydzieli  obszar  pamici
       przeznaczony  na  stos  potomka  i  przekaza  wskanik do tego obszaru w
       clone.  Stosy rosn w dol na wszystkich procesorach, na  ktorych  dziala
       Linux (z wyjtkiem procesorow HP PA), wic child_stack zazwyczaj wskazuje
       na najwyszy adres obszaru pamici zarezerwowanego na stos potomka.

       Niszy bajt flags zawiera  numer  sygnalu  wysylanego  do  rodzica,  gdy
       proces  potomny ginie.  Jeli okrelono inny sygnal ni SIGCHLD, to proces
       macierzysty musi poda opcj __WALL lub  __WCLONE  czekajc  na  potmka  w
       wait(2).   Gdy  sygnal nie zostanie okrelony, to proces macierzysty nie
       zostanie zawiadomiony o zakoczeniu pracy potomka.

       flags moe rownie by bitowym OR jednej  lub  kilku  nastpujcych  stalych
       okrelajcych,  co  bdzie  wspoldzielone  pomidzy  procesem  wywolujcym a
       procesem potomnym:

       CLONE_PARENT
              (od Linuksa 2.4 w gor) Jeli  CLONE_PARENT  bdzie  ustawione,  to
              rodzic  nowego  procesu  potomnego  (zwrocony  przez getppid(2))
              bdzie ten sam, co dla procesu wywolujcego.

              Jeli CLONE_PARENT nie zostanie ustawione, to (jak  dla  fork(2))
              rodzicem potomka bdzie proces wywolujcy.

              Naley   zauway,   e   to   proces  macierzysty,  zwracany  przez
              getppid(2),  zostanie  powiadomiony  o  zakoczeniu  pracy  przez
              potomka,  wic jeli CLONE_PARENT bdzie ustawione, to zawiadomiony
              zostanie rodzic procesu wywolujcego, a nie sam proces wywolujcy

       CLONE_FS
              Jeli ustawione bdzie CLONE_FS, to wywolujcy i proces potomny  bd
              wspoldzieli  informacje o systemie plikow. Informacje te obejmuj
              katalog glowny systemu plikow, biecy katalog  roboczy  i  umask.
              Dowolne z wywola chroot(2), chdir(2) lub umask(2) wykonane przez
              proces wywolujcy lub proces potomny  bdzie  obowizywa  rownie  w
              drugim procesie.

              Jeli  CLONE_FS  nie  zostanie ustawione, to proces potomny bdzie
              pracowa  na  kopii  informacji   o   systemie   plikow   procesu
              wywolujcego  z  chwili  wywolania  clone.   Wywolania chroot(2),
              chdir(2), umask(2) wykonane poniej przez jeden z procesow nie bd
              mie wplywu na drugi proces.

       CLONE_FILES
              Jeli  CLONE_FILES bdzie ustawione, to proces wywolujcy i procesy
              potomne bd wspoldzieli tablic deskryptorow  plikow.  Deskryptory
              plikow   zawsze   bd  dotyczy  tych  samych  plikow  w  procesie
              wywolujcym i w procesach  potomnych.  Dowolny  deskryptor  pliku
              utworzony  przez  proces  wywolujcy, jak te przez proces potomny
              bdzie obowizywa rownie w drugim procesie. Podobnie, jeli jeden z
              procesow zamknie deskryptor pliku lub zmieni stowarzyszone z nim
              znaczniki, bdzie to obowizywa rownie w drugim procesie.

              If  CLONE_FILES  nie  zostanie  ustawione,  to  proces   potomny
              odziedziczy  kopi  wszystkich  deskryptorow  plikow  otwartych w
              procesie macierzystym w chwili  wywolania  clone.   Operacje  na
              deskryptorach   plikow   przeprowadzone   poniej   przez  proces
              wywolujcy lub przez proces potomny nie bd mialy wplywu na  drugi
              proces.

       CLONE_NEWNS
              (poczwszy  od  Linuksa  2.4.19) Uruchamianie procesu potomnego w
              nowej przestrzeni nazw.

              Kady proces istnieje w jakiej przestrzeni nazw.  przestrze  nazw
              procesu  s  to  dane  (zbior  montowa) opisujce hierarchi plikow
              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 wywolujcego, a zatem take innych procesow
              yjcych w tej samej przestrzeni nazw,  lecz  nie  maj  wplywu  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  moe  zosta  podany  jedynie  przez proces
              uprzywilejowany.  Zabronione jest podanie w tym samym  wywolaniu
              clone zarowno CLONE_NEWNS, jak i CLONE_FS.

       CLONE_SIGHAND
              Jeli  CLONE_SIGHAND  bdzie  ustawione,  to  proces  wywolujcy  i
              procesy  potomne  bd  wspoldzieli   tablic   programow   obslugi
              sygnalow.  Jeli  proces  wywolujcy  lub  proces  potomny  wywola
              sigaction(2),  aby  zmieni  zachowanie  towarzyszce   sygnalowi,
              zachowanie  to  zostanie  zmienione  rownie  w  drugim procesie.
              Jednake, proces wywolujcy i proces potomny wci bd posiada osobne
              maski  sygnalow  i  zestawy  sygnalow oczekujcych. Zatem jeden z
              nich moe zablokowa  lub  odblokowa  niektore  sygnaly  za  pomoc
              sigprocmask(2) nie wplywajac na drugi proces.

              Jeli  CLONE_SIGHAND  nie  zostanie  ustawione, to proces potomny
              odziedziczy  kopi  programow   obslugi   sygnalow   od   procesu
              wywolujcego z chwili uruchomienia clone.  Wywolania sigaction(2)
              przeprowadzone poniej przez jeden z procesow nie bd  mie  wplywu
              na drugi proces.

       CLONE_PTRACE
              Jeli  zostanie  podane  CLONE_PTRACE,  a  proces wywolujcy bdzie
              ledzony, to ledzenie obejmie rownie potomka (zobacz ptrace(2)).

       CLONE_VFORK
              Jeli   CLONE_VFORK   bdzie   ustawione,   wykonywanie    procesu
              wywolujcego  zostanie  wstrzymane  do chwili, gdy potomek zwolni
              swoj pami wirtualn za pomoc execve(2)  lub  _exit(2)  (jak  przy
              vfork(2)).

              Jeli  CLONE_VFORK  nie  zostanie ustawione, wtedy zarowno proces
              wywolujcy,  jak  i   potomny   podlegaj   po   wywolaniu   clone
              szeregowaniu zada i aplikacja nie moe zaklada, e ich wykonywanie
              bdzie si odbywa w okrelonej kolejnoci.

       CLONE_VM
              Jeli CLONE_VM bdzie ustawione, to proces wywolujcy i potomny  bd
              dziala  w  tym  samym obszarze pamici. W szczegolnoci, zapisy do
              pamici  wykonywane  przez  proces  wywolujcy  lub  przez  proces
              potomny  bd  widoczne dla drugiego z procesow.  Ponadto, dowolne
              mapowania pamici i usunicia mapowa wykonane przez jeden  z  tych
              procesow  za  pomoc  mmap(2)  lub  munmap(2)  bd  dotyczy rownie
              drugiego procesu.

              Jeli CLONE_VM nie zostanie ustawione, to  proces  potomny  bdzie
              dziala  w  kopii obszaru pamici procesu wywolujcego, wykonanej w
              chwili wywolania clone.   Zapisy  do  pamici  oraz  mapowania  i
              usunicia  mapowa  wykonane  przez  jeden  z tych procesow nie bd
              dotyczy drugiego z nich, tak jak w przypadku fork(2).

       CLONE_PID
              Jeli CLONE_PID bdzie ustawione, to proces potomny bdzie tworzony
              z tym samym ID procesu, jaki ma proces wywolujcy.

              Jeli  CLONE_PID  nie zostanie ustawione, to proces potomny bdzie
              mie unikalny ID procesu, inny ni ID procesu wywolujcego.

              Ten znacznik moe  by  podany  tylko  przez  proces  uruchamiajcy
              system (PID 0).

       CLONE_THREAD
              (Poczwszy  od Linuksa 2.4) Jeli CLONE_THREAD bdzie ustawione, to
              potomek bdzie umieszczony w tej samej grupie  wtkow,  do  ktorej
              naley proces wywolujcy.

              Jeli  CLONE_THREAD  nie  zostanie  ustawione,  to  potomek bdzie
              umieszczony w swojej wlasnej (nowej)  grupie  wtkow,  ktorej  ID
              jest taki sam, jak ID procesu.

              (Grupy  wtkow  zostaly  dodane w Linuksie 2.4 dla obslugiwa wtki
              POSIX-owe dla zbioru procesow  wspoldzielcych  ten  sam  PID.  W
              Linuksie  2.4 wywolania funkcji getpid(2) zwracaj ID grupy wtkow
              procesu wywolujcego.)

       Funkcja systemowa sys_clone odpowiada w sposob bardziej zbliony funkcji
       fork(2),  w  ktorej  wykonanie  procesu  potomnego jest kontynuowane od
       miejsca wywolania.  Zatem, sys_clone wymaga jedynie argumentow flags  i
       child_stack,  ktore  maj  znaczenie  takie samo, jak dla clone.  (Naley
       zauway, e kolejno tych argumentow jest inna anieli dla clone.)

       Inna ronic w przypadku sys_clone jest to, e argument child_stack moe by
       zerem.   W   tym   przypadku,  semantyka  "kopiowania  podczas  zapisu"
       gwarantuje, e proces potomny otrzyma osobn kopi stosu, gdy ktorykolwiek
       z  procesow  zmodyfikuje  stos.  W  tym  przypadku aby funkcja dzialala
       prawidlowo, nie naley podawa opcji CLONE_VM.

WARTO ZWRACANA

       Po pomylnym zakoczeniu, w wtku rodzica zwracany jest  PID  potomka.   W
       wypadku  bldu,  w  kontekcie  procesu  wywolujcego  zwracane jest -1, a
       proces potomny nie jest tworzony i odpowiednio ustawiane jest errno .

B/LDY

       EAGAIN Dziala ju zbyt wiele procesow.

       ENOMEM Za malo  pamici  aby  przydzieli  struktu  zadania  dla  procesu
              potomnego, lub aby skopiowa niezbdne fragmenty kontekstu procesu
              wywolujcego.

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

       EINVAL W flags podano jednoczenie CLONE_FS i CLONE_NEWNS.

       EINVAL Podano CLONE_THREAD a nie podano  CLONE_SIGHAND.   (Poczwszy  od
              Linuksa 2.5.35.)

       EPERM  CLONE_PID zostalo podane przez proces o niezerowym PID.

USTERKI

       Dla  wersji  jdra  2.1.97  nie naley uywa znacznika CLONE_PID, gdy inne
       czci  jdra  i  wikszo  oprogramowania   systemowego   wc   zaklada,   e
       identyfikatory procesow s unikalne.

       Brak wpisu dla clone w wersji 5 biblioteki libc. libc 6 (inaczej, glibc
       2) udostpnia clone zgodnie z opisem na niniejszej stronie podrcznika.

UWAGI

       Dla wersji jdra 2.4.7-2.4.18 znacznik  CLONE_THREAD  wymuszal  znacznik
       CLONE_PARENT.

ZGODNE Z

       Funkcje  clone  i  sys_clone s specyficzne dla Linuksa i nie powinny by
       uywane w programach przenonych.  Piszc programy aplikacji wielowtkowych
       (wiele  wtkow  zarzdzajcych  tym  samym  obszarem  pamici), lepiej uywa
       biblioteki wspomagajcej wielowtkowe API zgodne z POSIX 1003.1c,  takiej
       jak    biblioteka    LinuxThreads    (zawarta    w    glibc2).   Zobacz
       pthread_create(3).

       Ta strona podrcznika dotyczy jder  2.0.x,  2.1.x,  2.2.x,  2.4.x,  oraz
       glibc 2.0.x i 2.1.x.

ZOBACZ TAKE

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

INFORMACJE O T/LUMACZENIU

       Powysze  tlumaczenie  pochodzi z nieistniejcego ju Projektu Tlumaczenia
       Manuali i moe nie by aktualne. W razie zauwaenia ronic  midzy  powyszym
       opisem  a  rzeczywistym  zachowaniem  opisywanego programu lub funkcji,
       prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.