Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

Aféierung fir Betribssystemer

Hey Habr! Ech géif gären op Är Opmierksamkeet eng Serie vun Artikelen-Iwwersetzunge vun enger interessant Literatur an menger Meenung ze bréngen - OSTEP. Dëst Material diskutéiert ganz déif d'Aarbecht vun Unix-ähnlechen Betribssystemer, nämlech d'Aarbecht mat Prozesser, verschidde Scheduler, Erënnerung an aner ähnlech Komponenten, déi e modernen OS ausmaachen. Dir kënnt d'Original vun all Material hei gesinn hei. Maacht weg datt d'Iwwersetzung onprofessionell (zimlech fräi) gemaach gouf, awer ech hoffen, datt ech déi allgemeng Bedeitung behalen hunn.

Labo Aarbecht zu dësem Thema kann hei fonnt ginn:

Aner Deeler:

Dir kënnt och mäi Kanal kucken op Telegramm =)

Alarm! Et gëtt e Labo fir dëse Virtrag! Kuckt github

Prozess API

Loosst eis e Beispill kucken fir e Prozess an engem UNIX System ze kreéieren. Et geschitt duerch zwee System Appellen Forschett() и exec().

Call Gabel ()

Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

Betruecht e Programm datt eng Gabel mécht () Opruff. D'Resultat vu senger Ausféierung wäert wéi follegt sinn.

Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

Als éischt gitt mir d'Haaptfunktioun () an drécken d'String op den Ecran. D'Linn enthält de Prozessidentifizéierer deen am Original genannt gëtt Colombera oder Prozess Identifizéierer. Dësen Identifizéierer gëtt an UNIX benotzt fir op e Prozess ze referenzéieren. Déi nächst Kommando ruffen fork (). Zu dësem Zäitpunkt gëtt eng bal exakt Kopie vum Prozess erstallt. Fir den OS gesäit et aus wéi wann et 2 Exemplare vum selwechte Programm um System leeft, deen am Tour d'Gabel () Funktioun ausléisst. Den nei erstallt Kand Prozess (a Relatioun zu der Elterendeel Prozess datt et erstallt) gëtt net méi ausgefouert ginn, ugefaange vun der Haaptrei () Funktioun. Et sollt een drun erënneren datt e Kandprozess net eng exakt Kopie vum Eltereprozess ass, et huet säin eegene Adressraum, seng eege Registere, säin eegene Pointer fir ausführbar Instruktiounen, an dergläiche. Sou wäert de Wäert zréck op den Uruff vun der Gabel () Funktioun anescht ginn. Besonnesch d'Eltereprozess kritt de PID-Wäert vum Kandprozess als Retour, an d'Kand kritt e Wäert gläich wéi 0. Mat dëse Retourcoden kënnt Dir dann Prozesser trennen an all eenzel vun hinnen zwéngen hir eegen Aarbecht ze maachen. . Wéi och ëmmer, d'Ausféierung vun dësem Programm ass net strikt definéiert. Nodeems Dir an 2 Prozesser opgedeelt ass, fänkt d'OS un se ze iwwerwaachen, souwéi hir Aarbecht ze plangen. Wann et op engem Single-Core Prozessor ausgefouert gëtt, wäert ee vun de Prozesser, an dësem Fall den Elterendeel, weider schaffen, an da kritt de Kannerprozess Kontroll. Beim Restart kann d'Situatioun anescht sinn.

Call wait ()

Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

Betruecht de folgende Programm. An dësem Programm, wéinst der Präsenz vun engem Opruff waarden () D'Eltereprozess wäert ëmmer waarden bis de Kandprozess fäerdeg ass. An dësem Fall wäerte mir eng strikt definéiert Textausgang um Bildschierm kréien

Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

exec() Opruff

Betribssystemer: Dräi einfach Stécker. Deel 3: Prozess API (Iwwersetzung)

Betruecht d'Erausfuerderung exec(). Dëse System Uruff ass nëtzlech wa mir e komplett anere Programm lafen wëllen. Hei wäerte mir ruffen execvp() fir de wc Programm auszeféieren deen e Wuertzielprogramm ass. Wat geschitt wann exec () genannt gëtt? Dësen Uruff gëtt den Numm vun der ausführbarer Datei an e puer Parameteren als Argumenter iwwerginn. Duerno ginn de Code a statesch Daten aus dëser ausführbarer Datei gelueden an säin eegene Segment mam Code iwwerschriwwen. Déi verbleiwen Erënnerungsberäicher, wéi de Stack an de Koup, ginn nei initialiséiert. Duerno leeft d'OS einfach de Programm aus, passéiert et eng Rei vun Argumenter. Also hu mir keen neie Prozess erstallt, mir hunn den aktuell lafende Programm einfach an en anere lafende Programm transforméiert. Nodeems Dir den exec () Uruff am Nofolger ausgefouert huet, schéngt et wéi wann den originale Programm guer net gelaf ass.

Dës Startup Komplikatioun ass komplett normal fir eng Unix Shell, an erlaabt dës Shell Code auszeféieren nodeems se uruffen Forschett(), awer virum Opruff exec(). E Beispill vu sou engem Code wier d'Upassung vum Shellëmfeld un d'Bedierfnesser vum Programm deen lancéiert gëtt, ier se lancéiert.

Shell - just e Benotzer Programm. Si weist Iech d'Invitatiounslinn a waart op datt Dir eppes dran schreift. Am meeschte Fäll, wann Dir den Numm vun engem Programm do schreift, fënnt d'Schuel seng Plaz, rufft d'Gabel () Method, an rufft dann eng Zort Exec () fir en neie Prozess ze kreéieren a waart bis et fäerdeg ass mat engem wait () ruffen. Wann d'Kand Prozess Sortie, der Réibau wäert zréck aus der wait () Opruff an Drécken der VIRSCHLOEN erëm an wait fir déi nächst Kommando aginn.

D'Gabel () & exec () Split erlaabt der Shell déi folgend Saachen ze maachen, zum Beispill:
wc Datei > nei_Datei.

An dësem Beispill gëtt d'Ausgab vum wc Programm op eng Datei ëmgeleet. De Wee wéi d'Schuel dëst erreecht ass ganz einfach - andeems Dir e Kandprozess erstellt ier Dir rufft exec(), d'Schuel schléisst Standardausgang an mécht d'Datei op nei_Datei, also all Ausgang aus dem weider lafende Programm wc gëtt op eng Datei ëmgeleet amplaz vun engem Écran.

Unix Pipe ginn op eng ähnlech Manéier ëmgesat, mam Ënnerscheed datt se e Pipe benotzen () Call. An dësem Fall gëtt den Ausgangsstroum vum Prozess mat enger Päifschlaang verbonnen, déi am Kärel läit, op déi den Input Stream vun engem anere Prozess verbonne gëtt.

Source: will.com

Setzt e Commentaire