_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/fork - sukuria naują procesą, tolygų esamam
  • fork

    Atlieka fork(2) sisteminį kvietimą sukurti naują procesą su ta pačia programa, toje pačioje vietoje. Grąžina vaiko pid tėvo procesui, 0 vaiko procesui arba undef nesėkmės atveju. Failų deskriptoriai (ir kartais tų deskriptorių užraktai (lock)) yra bendri, tuo tarpu visa kita kopijuojama. Daugumoje sistemų, palaikančių fork(), jam buvo skiriamas didelis dėmesys, siekiant padaryti kaip galima efektyvesnį (pvz. naudojant copy-on-write technologiją duomenų puslapiuose), padarant iš jo dominuojančią paradigmą daugiaprogramiam režimui pastaraisiais dešimtmečiais.

    Pradedant nuo Perl v5.6.0 kvietimas mėgins visus atidarytus išvedimui failus sulygiuoti prieš fork'inant vaiko procesą, bet kai kuriose platformose tai gali būti nepalaikoma (žr. perlport). Kad apsisaugotumėte nuo to, gali reikėti $| ($AUTOFLUSH angliškai) arba iškviestiautoflush() handle'ų metodą IO::Handle bet kuriam atidarytam handle'ui siekiant išvengti išvesties dubliavimosi.

    Jei fork'inama nelaukiant vaikų, susikaups zombiukų. Kai kuriose sistemose, to galima išvengti nustatant $SIG{CHLD} į "IGNORE" . Taip pat žr. perlipc dėl forkinimo pavyzdžių ir atgyvenusių vaikučių žudymą.

    Pažymėtina, kad jei fork'intas vaikas paveldi sisteminio failo deskriptorius, kaip kad STDIN ir STDOUT, kurie šiaip jau yra sujungti per socket'ą arba pipe'ą, net ir išėjimo atveju, nutolęs serveris (kaip, tarkim CGI skriptas arba foninis (background) darbas yra paleidžiami iš nutolusio apvalkalo (shell)) nemanys kad darbas baigtas. Geriausia tokiu atveju iš naujo juos atidaryti nurodant į /dev/null

algirdas@perl.lt 2005.04.11 - $dabar