Provided by:
manpages-pl-dev_20060617-3_all 
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.