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