1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
|
.\" Hey Emacs! This file is -*- nroff -*- source.
.\"
.\" Copyright (c) 1992 Drew Eckhardt <drew@cs.colorado.edu>, March 28, 1992
.\" and Michael Kerrisk, 2001, 2002
.\" May be distributed under the GNU General Public License.
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 24 Jul 1993 by Rik Faith <faith@cs.unc.edu>
.\" Modified 21 Aug 1994 by Michael Chastain <mec@shell.portal.com>:
.\" New man page (copied from 'fork.2').
.\" Modified 10 June 1995 by Andries Brouwer <aeb@cwi.nl>
.\" Modified 25 April 1998 by Xavier Leroy <Xavier.Leroy@inria.fr>
.\" Modified 26 Jun 2001 by Michael Kerrisk
.\" Mostly upgraded to 2.4.x
.\" Added prototype for sys_clone() plus description
.\" Added CLONE_THREAD with a brief description of thread groups
.\" Added CLONE_PARENT and revised entire page remove ambiguity
.\" between "calling process" and "parent process"
.\" Added CLONE_PTRACE and CLONE_VFORK
.\" Added EPERM and EINVAL error codes
.\" Renamed "__clone" to "clone" (which is the protype in <sched.h>)
.\" various other minor tidy ups and clarifications.
.\" Modified 26 Jun 2001 by Michael Kerrisk <mtk16@ext.canterbiry.ac.nz>
.\" Updated notes for 2.4.7+ behaviour of CLONE_THREAD
.\" Modified 15 Oct 2002 by Michael Kerrisk <mtk16@ext.canterbiry.ac.nz>
.\" Added description for CLONE_NEWNS, which was added in 2.4.19
.\" Slightly rephrased, aeb.
.\" Modified 1 Feb 2003 - added CLONE_SIGHAND restriction, aeb.
.\"
.\" Translation 1998 (c) Przemek Borys <pborys@dione.ids.pl>
.\" 2001,2003 (c) A. Krzysztofowicz <ankry@mif.pg.gda.pl>
.\" Last update: A. Krzysztofowicz <ankry@mif.pg.gda.pl> - Apr 2003
.\" man-pages 1.55
.\"
.TH CLONE 2 2001-12-31 "Linux 2.4" "Podręcznik programisty Linuksa"
.SH NAZWA
clone \- utworzenie procesu potomnego
.SH SKŁADNIA
.B #include <sched.h>
.sp
.BI "int clone(int (*" "fn" ")(void *), void *" "child_stack" ", int " "flags" ", void *" "arg" );
.sp
.BI "_syscall2(int, " "clone" ", int, " "flags" ", void *, " "child_stack" )
.SH OPIS
\fI Uwaga! To tłumaczenie może być nieaktualne!\fP
.PP
.B clone
tworzy nowy proces, podobnie jak
.BR fork (2).
.B clone
jest funkcją biblioteczną
posadowioną na wierzchu niższego wywołania funkcji systemowej
.BR clone ,
do której w dalszym ciągu będziemy się odnosić jako do
.BR sys_clone .
Opis
.BR sys_clone
jest podany pod koniec niniejszej strony.
W odróżnieniu od
.BR 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
.B CLONE_PARENT
poniżej.)
.B 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ą
.B clone
tworzony jest proces potomny, uruchamia on aplikację funkcyjną
.IR fn ( arg ).
(Różni się to od
.BR fork (2),
gdzie proces potomny kontynuuje wykonanie od miejsca wywołania
.BR fork (2).)
Argument
.I fn
jest wskaźnikiem do funkcji, która jest wywoływana przez proces potomny na
początku jego działania.
Argument
.I arg
jest przekazywany do funkcji
.IR fn .
Gdy aplikacja funkcyjna
.IR fn ( arg )
powróci, proces potomny kończy działanie. Liczba całkowita zwrócona przez
.I fn
jest kodem zakończenia procesu potomnego. Proces potomny może również
zakończyć się jawnie wołając
.BR exit (2)
lub po otrzymaniu krytycznego sygnału.
Argument
.I 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
.BR clone .
Stosy rosną w dół na wszystkich procesorach, na których działa Linux
(z wyjątkiem procesorów HP PA), więc
.I child_stack
zazwyczaj wskazuje na najwyższy adres obszaru pamięci zarezerwowanego na
stos potomka.
Niższy bajt
.I flags
zawiera numer sygnału wysyłanego do rodzica, gdy proces potomny ginie.
Jeśli określono inny sygnał niż
.BR SIGCHLD ,
to proces macierzysty musi podać opcję
.B __WALL
lub
.B __WCLONE
czekając na potmka w
.BR wait (2).
Gdy sygnał nie zostanie określony, to proces macierzysty nie zostanie
zawiadomiony o zakończeniu pracy potomka.
.I 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:
.TP
.B CLONE_PARENT
(od Linuksa 2.4 w górę) Jeśli
.B CLONE_PARENT
będzie ustawione, to rodzic nowego procesu potomnego (zwrócony przez
.BR getppid (2))
będzie ten sam, co dla procesu wywołującego.
Jeśli
.B CLONE_PARENT
nie zostanie ustawione, to (jak dla
.BR fork (2))
rodzicem potomka będzie proces wywołujący.
Należy zauważyć, że to proces macierzysty, zwracany przez
.BR getppid (2),
zostanie powiadomiony o zakończeniu pracy przez potomka, więc jeśli
.B CLONE_PARENT
będzie ustawione, to zawiadomiony zostanie rodzic procesu wywołującego,
a nie sam proces wywołujący
.TP
.B CLONE_FS
Jeśli ustawione będzie
.BR 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ń
.BR chroot (2),
.BR chdir (2)
lub
.BR umask (2)
wykonane przez proces wywołujący lub proces potomny będzie obowiązywać również
w drugim procesie.
Jeśli
.B 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
.BR clone .
Wywołania
.BR chroot (2),
.BR chdir (2),
.BR umask (2)
wykonane później przez jeden z procesów nie będą mieć wpływu na drugi proces.
.TP
.B CLONE_FILES
Jeśli
.B 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
.B CLONE_FILES
nie zostanie ustawione, to proces potomny odziedziczy kopię wszystkich
deskryptorów plików otwartych w procesie macierzystym w chwili wywołania
.BR 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.
.TP
.B CLONE_NEWNS
(począwszy od Linuksa 2.4.19)
Uruchamianie procesu potomnego w nowej przestrzeni nazw.
Każdy proces istnieje w jakiejś przestrzeni nazw.
.I przestrzeń nazw
procesu są to dane (zbiór montowań) opisujące hierarchię plików widzianą
przez proces. Po
.BR fork (2)
lub
.BR clone (2),
gdy nie ustawiono znacznika
.BR CLONE_NEWNS ,
potomek żyje w tej samej przestrzeni nazw, co rodzic.
Funkcje systemowe
.BR mount (2)
i
.BR 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
.BR clone (2),
gdy ustawiono znacznik
.BR CLONE_NEWNS ,
sklonowany potomek jest uruchamiany w nowej przestrzeni nazw, inicjowanej
jako kopia przestrzeni nazw rodzica.
Znacznik
.B CLONE_NEWNS
może zostać podany jedynie przez proces uprzywilejowany.
.\" The required capability is CAP_SYS_ADMIN. -- MTK, 15 Oct 02
Zabronione jest podanie w tym samym wywołaniu
.B clone
zarówno
.BR CLONE_NEWNS ,
jak i
.BR CLONE_FS .
.TP
.B CLONE_SIGHAND
Jeśli
.B 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
.BR 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ą
.BR sigprocmask (2)
nie wpływajac na drugi proces.
Jeśli
.B CLONE_SIGHAND
nie zostanie ustawione, to proces potomny odziedziczy kopię programów obsługi
sygnałów od procesu wywołującego z chwili uruchomienia
.BR clone .
Wywołania
.BR sigaction (2)
przeprowadzone później przez jeden z procesów nie będą mieć wpływu na drugi
proces.
.TP
.B CLONE_PTRACE
Jeśli zostanie podane
.BR CLONE_PTRACE ,
a proces wywołujący będzie śledzony, to śledzenie obejmie również potomka
(zobacz
.BR ptrace (2)).
.TP
.B CLONE_VFORK
Jeśli
.B CLONE_VFORK
będzie ustawione, wykonywanie procesu wywołującego zostanie wstrzymane
do chwili, gdy potomek zwolni swoją pamięć wirtualną za pomocą
.BR execve (2)
lub
.BR _exit (2)
(jak przy
.BR vfork (2)).
Jeśli
.B CLONE_VFORK
nie zostanie ustawione, wtedy zarówno proces wywołujący, jak i potomny
podlegają po wywołaniu
.B clone
szeregowaniu zadań i aplikacja nie może zakładać, że ich wykonywanie będzie
się odbywać w określonej kolejności.
.TP
.B CLONE_VM
Jeśli
.B 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ą
.BR mmap (2)
lub
.BR munmap (2)
będą dotyczyć również drugiego procesu.
Jeśli
.B 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
.BR 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
.BR fork (2).
.TP
.B CLONE_PID
Jeśli
.B CLONE_PID
będzie ustawione, to proces potomny będzie tworzony z tym samym ID procesu,
jaki ma proces wywołujący.
Jeśli
.B 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).
.TP
.B CLONE_THREAD
(Począwszy od Linuksa 2.4)
Jeśli
.B 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
.B 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
.BR getpid (2)
zwracają ID grupy wątków procesu wywołującego.)
.PP
Funkcja systemowa
.B sys_clone
odpowiada w sposób bardziej zbliżony funkcji
.BR fork (2),
w której wykonanie procesu potomnego jest kontynuowane od miejsca wywołania.
Zatem,
.B sys_clone
wymaga jedynie argumentów
.I flags
i
.IR child_stack ,
które mają znaczenie takie samo, jak dla
.BR clone .
(Należy zauważyć, że kolejność tych argumentów jest inna aniżeli dla
.BR clone .)
Inna różnicą w przypadku
.B sys_clone
jest to, że argument
.I 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
.BR CLONE_VM .
.SH "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
.I errno .
.SH BŁĘDY
.TP
.B EAGAIN
Działa już zbyt wiele procesów.
.TP
.B ENOMEM
Za mało pamięci aby przydzielić struktuę zadania dla procesu potomnego,
lub aby skopiować niezbędne fragmenty kontekstu procesu wywołującego.
.TP
.B EINVAL
Zwracane przez
.BR clone ,
gdy podano dla
.I child_stack
wartość zerową.
.TP
.B EINVAL
W
.I flags
podano jednocześnie
.B CLONE_FS
i
.BR CLONE_NEWNS .
.TP
.B EINVAL
Podano
.B CLONE_THREAD
a nie podano
.BR CLONE_SIGHAND .
(Począwszy od Linuksa 2.5.35.)
.TP
.B EPERM
.B CLONE_PID
zostało podane przez proces o niezerowym PID.
.SH USTERKI
Dla wersji jądra 2.1.97 nie należy używać znacznika
.BR 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
.B clone
w wersji 5 biblioteki libc. libc 6 (inaczej, glibc 2) udostępnia
.B clone
zgodnie z opisem na niniejszej stronie podręcznika.
.SH UWAGI
Dla wersji jądra 2.4.7-2.4.18 znacznik CLONE_THREAD wymuszał znacznik
CLONE_PARENT.
.SH "ZGODNE Z"
Funkcje
.B clone
i
.B 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
.BR 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.
.SH "ZOBACZ TAKŻE"
.BR fork (2)
.BR wait (2),
.BR pthread_create (3)
.SH "INFORMACJE O TŁUMACZENIU"
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i
\fImoże nie być aktualne\fR. 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:
.IP
man \-\-locale=C 2 clone
.PP
Prosimy o pomoc w aktualizacji stron man \- więcej informacji można znaleźć pod
adresem http://sourceforge.net/projects/manpages\-pl/.
|