Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

Destpêka Pergalên Xebatê

Hey Habr! Ez dixwazim rêzek gotar-wergerên yek wêjeya balkêş bi nerîna min - OSTEP-ê bînim ber çavên we. Ev materyal bi kûrahî li ser xebata pergalên xebitandinê yên mîna unix-ê nîqaş dike, ango, xebata bi pêvajoyên, plansazkerên cihêreng, bîranîn û hêmanên din ên mîna ku OS-ya nûjen pêk tînin. Hûn dikarin orîjînala hemî materyalan li vir bibînin vir. Ji kerema xwe bala xwe bidin ku werger bi rengek neprofesyonel (gelek serbest) hatîye kirin, lê ez hêvî dikim ku min wateya giştî parastiye.

Xebatên laboratîfê yên li ser vê mijarê li vir têne dîtin:

Parçeyên din:

Hûn dikarin li kanala min jî temaşe bikin têlxiram =)

Hawar! Ji bo vê dersê laboratûwarek heye! Dîtinî github

Pêvajoya API

Werin em li mînakek çêkirina pêvajoyek di pergala UNIX de binêrin. Ew bi du bangên pergalê pêk tê milêvdanî() и exec ().

Call fork ()

Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

Bernameyek ku bangek fork() dike bihesibînin. Encama pêkanîna wê dê wiha be.

Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

Berî her tiştî, em têkevin fonksiyona sereke () û rêzika li ser ekranê çap bikin. Rêz nasnameya pêvajoyê ya ku di orjînal de jê re tê gotin vedihewîne PID an nasnameya pêvajoyê. Ev nasname di UNIX de ji bo pêvajoyek tête bikar anîn. Fermana paşîn dê banga fork (). Di vê nuqteyê de, hema hema kopiyek rastîn a pêvajoyê tê afirandin. Ji bo OS-ê, wusa dixuye ku li ser pergalê 2 kopiyên heman bernameyê hene, ku di encamê de dê ji fonksiyona fork() derkeve. Pêvajoya zarokê ya nû hatî afirandin (bi pêvajoya dêûbavê ku ew afirandiye ve girêdayî ye) dê êdî ji fonksiyona sereke () dest pê bike. Pêdivî ye ku ji bîr mekin ku pêvajoyek zarok ne kopiyek rastîn a pêvajoya dêûbav e, bi taybetî cîhê navnîşana wê, tomarên xwe, nîşana xwe ya talîmatên bikêr û yên wekî wan heye. Bi vî rengî, nirxa ku ji bangkerê fonksiyona fork() re vedigere dê cûda be. Bi taybetî, pêvajoya dêûbav dê nirxa PID ya pêvajoya zarokê wekî vegerê werbigire, û zarok dê nirxek bi qasî 0-yê werbigire. Bi karanîna van kodên vegerê, hûn hingê dikarin pêvajoyan ji hev veqetînin û her yek ji wan neçar bikin ku karê xwe bikin. . Lêbelê, pêkanîna vê bernameyê bi hişkî nehatiye destnîşankirin. Piştî dabeşkirina 2 pêvajoyan, OS dest bi çavdêriya wan dike, û her weha karê wan jî plan dike. Ger li ser pêvajoyek yek-core were darve kirin, yek ji pêvajoyên, di vê rewşê de dêûbav, dê xebata xwe bidomîne, û dûv re dê pêvajoya zarokê kontrolê bistîne. Dema ku ji nû ve dest pê dike, dibe ku rewş cûda be.

Li benda banga ()

Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

Bernameya jêrîn bifikirin. Di vê bernameyê de, ji ber hebûna bangekê payin() Pêvajoya dêûbav dê her dem li benda qedandina pêvajoya zarokê bimîne. Di vê rewşê de, em ê li ser ekranê hilberek nivîsê ya bi hişkî diyarkirî bistînin

Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

exec () bang

Pergalên Xebatê: Sê Parçeyên Hêsan. Beş 3: Pêvajoya API (werger)

Pirsgirêkê bifikirin exec (). Dema ku em dixwazin bernameyek bi tevahî cûda bimeşînin ev banga pergalê bikêr e. Li vir em ê bang bikin execvp () ji bo bernameya wc ku bernameyeke hejmartina peyvan e bimeşîne. Dema ku exec () tê gotin çi dibe? Vê bangê navê pelê îcrakar û hin parameteran wekî arguman tê derbas kirin. Piştî vê yekê kod û daneyên statîk ên ji vê pelê vesazkirî têne barkirin û beşa wê ya bi kodê re tê nivîsandin. Deverên bîranînê yên mayî, yên wekî stûn û gir, ji nû ve têne destpêkirin. Piştî ku OS bi tenê bernameyê dimeşîne, komek argumanan jê re derbas dike. Ji ber vê yekê me pêvajoyek nû neafirand, me tenê bernameya ku niha tê xebitandin veguherand bernameyek din a xebitandinê. Piştî pêkanîna bangeşeya exec() di dûndanê de, wisa xuya dike ku bernameya orîjînal qet neçûye.

Ev tevliheviya destpêkê ji bo şêlek Unix-ê bi tevahî normal e, û dihêle ku ew şêl piştî bangkirinê kodê bicîh bike. milêvdanî(), lê berî bangê exec (). Mînaka kodek wusa dê ev e ku jîngeha şêlê li gorî hewcedariyên bernameya ku hatî destpêkirin, berî destpêkirina wê were sererast kirin.

Legan - tenê bernameyek bikarhêner. Ew rêzika vexwendinê nîşanî we dide û li bendê ye ku hûn tê de tiştek binivîsin. Di pir rewşan de, heke hûn navê bernameyekê li wir binivîsin, şêl dê cîhê xwe bibîne, gazî rêbaza fork() bike, û dûv re gazî hin celebek exec() bike da ku pêvajoyek nû biafirîne û li bendê bimîne ku ew bi karanîna pêvajoyek biqede. li bendê () bang. Dema ku pêvajoya zarokê derkeve, şêl dê ji banga payîn() vegere û daxwaznameyê dîsa çap bike û li bendê bimîne ku emrê paşîn têkevin.

Parçekirina fork() & exec() dihêle ku şêl van tiştan bike, mînakî:
pelê wc> pelê_new.

Di vê nimûneyê de, derketina bernameya wc ber bi pelek ve tê rêve kirin. Awayê ku şêl vê yekê digihîje pir hêsan e - bi afirandina pêvajoyek zarokê berî bangkirinê exec (), şêl hilberîna standard digire û pelê vedike new_pel, bi vî rengî, hemî hilbera ji bernameya pêşdetir a xebitandinê wc dê li şûna ekranek pelê were verast kirin.

boriya Unix bi rengek wekhev têne bicîh kirin, bi cûdahiya ku ew bangek boriyek () bikar tînin. Di vê rewşê de, herikîna hilberîna pêvajoyê dê bi rêzek boriyê ya ku di kernelê de ye ve were girêdan, ku têketina pêvajoyek din dê pê ve were girêdan.

Source: www.habr.com

Add a comment