Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

Fampidirana ny Rafitra fiasana

Hey Habr! Te-hitondra ny sainao andian-dahatsoratra aho - fandikana literatiora iray mahaliana araka ny hevitro - OSTEP. Ity fitaovana ity dia miresaka lalina momba ny asan'ny rafitra miasa toy ny unix, izany hoe, miasa miaraka amin'ireo dingana, fandaharam-potoana isan-karazany, fitadidiana ary singa mitovy amin'izany izay mandrafitra OS maoderina. Hitanao eto ny tany am-boalohany amin'ny fitaovana rehetra eto. Azafady, mariho fa ny fandikan-teny dia natao tamin'ny fomba tsy matihanina (tena malalaka), saingy manantena aho fa nitazona ny dikany ankapobeny.

Ny asa laboratoara momba ity lohahevitra ity dia azo jerena eto:

Fizarana hafa:

Azonao atao ihany koa ny mijery ny fantsona ao amin'ny telegrama =)

Fanairana! Misy laboratoara ho an'ity lahateny ity! Jereo github

Process API

Andeha hojerentsika ohatra iray amin'ny famoronana dingana amin'ny rafitra UNIX. Mitranga izany amin'ny alΓ lan'ny antso an-tariby roa fork () ΠΈ exec().

Antso fork()

Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

Diniho ny programa iray manao antso fork(). Toy izao ny vokatry ny fanatanterahana azy.

Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

Voalohany indrindra, miditra amin'ny asa lehibe () isika ary manonta ny tady amin'ny efijery. Ny tsipika dia misy ny famantarana ny dingana izay antsoina amin'ny voalohany PID na famantarana ny dingana. Ity identifier ity dia ampiasaina ao amin'ny UNIX mba hanondroana dingana iray. Ny baiko manaraka dia hiantso fork(). Amin'izao fotoana izao, ny dika mitovy amin'ny dingana dia noforonina. Ho an'ny OS, toa misy dika mitovy 2 amin'ny programa mitovy amin'ny rafitra, izay hivoaka ny fiasa fork(). Ny fizotry ny zaza vao teraka (mifandray amin'ny fizotry ny ray aman-dreny namorona azy) dia tsy hotanterahina intsony, manomboka amin'ny asa main(). Tokony ho tsaroana fa ny fizotry ny zaza dia tsy dika mitovy amin'ny dingan'ny ray aman-dreny, indrindra fa manana ny adiresiny manokana, ny rejisitra manokana, ny tondrony manokana amin'ny torolΓ lana azo tanterahina, sy ny toy izany. Noho izany, ny sanda miverina amin'ny mpiantso ny fork() dia ho hafa. Indrindra indrindra, ny fizotry ny ray aman-dreny dia hahazo ny sandan'ny PID amin'ny fizotran'ny zaza ho fiverenana, ary ny zaza dia hahazo sanda mitovy amin'ny 0. Amin'ny fampiasana ireo kaody fiverenana ireo dia azonao atao ny manasaraka ny dingana ary manery ny tsirairay amin'izy ireo hanao ny asany manokana. . Na izany aza, tsy voafaritra mazava ny fanatanterahana ity programa ity. Rehefa avy mizara ho dingana 2 ny OS dia manomboka manara-maso azy ireo, ary koa manomana ny asany. Raha tanterahana amin'ny processeur tokana tokana, ny iray amin'ireo dingana, amin'ity tranga ity, ny ray aman-dreny, dia hanohy hiasa, ary avy eo dia hahazo fanaraha-maso ny fizotran'ny zaza. Rehefa manomboka indray dia mety ho hafa ny toe-javatra.

Miantso miandry ()

Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

Diniho ity fandaharana manaraka ity. Amin'ity programa ity, noho ny fisian'ny antso miandry () Ny fizotry ny ray aman-dreny dia hiandry foana ny fizotry ny zaza. Amin'ity tranga ity, hahazo vokatra voafaritra voafaritra tsara eo amin'ny efijery isika

Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

exec() antso

Rafitra fiasana: Telo mora. Fizarana 3: Process API (fandikana)

Diniho ilay fanamby exec(). Ity antso an-tariby ity dia ilaina rehefa te-hanao programa hafa tanteraka isika. Eto isika dia hiantso execvp() hampandehanana ny programa wc izay programa fanisana teny. Inona no mitranga rehefa exec() no antsoina? Ity antso ity dia mandalo ny anaran'ny rakitra azo tanterahana sy ny masontsivana sasany ho tohan-kevitra. Aorian'izay dia ampidirina ny kaody sy ny angona static avy amin'ity rakitra azo tanterahana ity ary ny ampahany misy azy miaraka amin'ny kaody dia soratana. Ny faritra fitadidiana sisa, toy ny stack sy heap, dia averina averina. Aorian'izay, ny OS dia manatanteraka tsotra izao ny programa, mamindra azy amin'ny tohan-kevitra. Noho izany dia tsy namorona dingana vaovao izahay fa nanova ny programa mandeha amin'izao fotoana izao ho programa mandeha hafa. Aorian'ny fanatanterahana ny antso exec() amin'ny taranaka dia toa tsy mandeha mihitsy ilay programa tany am-boalohany.

Ara-dalΓ na tanteraka ho an'ny shell Unix ity fahasarotana fanombohana ity, ary mamela an'io shell io hanatanteraka kaody aorian'ny fiantsoana fork (), fa alohan'ny fiantsoana exec(). Ohatra iray amin'ny kaody toy izany ny fanitsiana ny tontolo manodidina ny akorandriaka amin'ny filan'ny programa atomboka, alohan'ny hamoahana azy.

Shell - programa mpampiasa fotsiny. Asehony anao ny tsipika fanasana ary miandry anao hanoratra zavatra ao anatiny. Amin'ny ankabeazan'ny toe-javatra, raha manoratra ny anaran'ny programa iray ianao, dia hahita ny toerana misy azy ny akorandriaka, antsoy ny fomba fork(), ary avy eo miantso karazana exec() mba hamoronana dingana vaovao ary miandry azy ho vita amin'ny fampiasana a miandry () antso. Rehefa mivoaka ny fizotry ny zaza dia hiverina avy amin'ny antso miandry () ny akorandriaka ary hanonta indray ny bitsika ary miandry ny baiko manaraka.

Ny fisarahana fork() & exec() dia mamela ny akorany hanao ireto zavatra manaraka ireto, ohatra:
wc file > new_file.

Amin'ity ohatra ity, ny fivoahan'ny programa wc dia alefa amin'ny rakitra iray. Ny fomba ahazoan'ny akorandriaka izany dia tsotra - amin'ny famoronana dingana ho an'ny ankizy alohan'ny hiantsoana exec(), ny shell dia manidy ny vokatra mahazatra ary manokatra ny rakitra new_file, noho izany, ny vokatra rehetra avy amin'ny programa mandeha hafa wc dia halefa any amin'ny rakitra iray fa tsy amin'ny efijery.

Unix pipe dia ampiharina amin'ny fomba mitovy, miaraka amin'ny fahasamihafana fa mampiasa pipe() antso. Amin'ity tranga ity, ny fizotry ny fizotran'ny dingana dia hampifandray amin'ny filaharana sodina hita ao amin'ny kernel, izay hampifandraisina amin'ny fidirana amin'ny dingana hafa.

Source: www.habr.com

Add a comment