Operatsioonisüsteemi funktsionid

Arvuti püsimälu (ROM) sisaldab mitmeid kasulikke funktsioone, nende kasutamine on võimalik katkestuse vahendusel. Asja lihtsustamiseks sisaldab päisefail BIOS.H vastavaid C - keele funktsioone. Need funktsioonid kasutavad oma ülesande täitmiseks tegelikult BIOSi funktsioone katkestuste vahendusel ja võimaldavad teile seega BIOSi funktsioonide kasutamise ilma assemblerkeele abita. BIOSi funktsioonide hulka kuuluvad näiteks otsene kettaseadme sektorite lugemine või kirjutamine, arvuti kella seadmine ja lugemine jms. Nimetatud funktsioonide kasutamisega tuleks olla ettevaatlik. Funktsioon biosdisk() näiteks loeb või kirjutab otseselt kettaseadmele, ilma seejuures kettal loodud kataloogidele või failidele tähelepanu omistamata. Selle funktsiooni vigane kasutamine võib muuta teie kettaseadme sisu mitteloetavaks. Teisest küljest saab aga selle funktsiooniga luua mitmeid kasulikke programme, nagu näiteks kettaseadise sisu optimeerija (nagu Nortoni SpeedDisk), mille jaoks harilikud C - funktsioonid ei sobi.

Ka operatsioonisüsteem DOS sisaldab mitmeid kasulikke funktsioone, mida programmid samuti kasutavad katkestuste vahendusel. Sellesse kategooriasse kuuluvad mälu reserveerimine DOSi funktsiooniga, kettaseadise sektorite või failide kirjutamine ja lugemine, mälu sisu muutmine kindlal aadressil ning palju muud. Neilegi vastavad Borland C funktsioonid, mis on defineeritud päisefailis DOS.H. Ka nende funktsioonidega tuleks olla ettevaatlik. Peatükis "Katkestused" vaadeldud funktsioonid int86(), intr() ja int86x() on samuti defineeritud päisefailis DOS.H

Päisefail PROCESS.H sisaldab funktsioone teiste programmide startimiseks, lõpetamiseks ja operatsioonisüsteemi käskude kasutamiseks.

Funktsioon system() kasutab soovitud käsu täitmiseks operatsioonisüsteemi käsuprogrammi COMMAND.COM.

int system(const char *command);

Näiteks:

system("DIR");

See funktsioon peatab hetkeks programmi töö, stardib kommandoprogrammi COMMAND.COM, laseb tal täita soovitud käsu ja jätkab seejärel programmi tööga. Kui käsk täideti, siis on funktsiooni tulemuseks 0, vastasel juhul on funktsiooni tulemuseks veakood.

Arvuti võib täita korraga mitut programmi. Kui te ühe programmiga (näiteks editoriga) hetkel töötate, siis võib arvuti kasutatada protsessori jõudehetki, täitmaks tagaplaanil veel teisi programme, mis hetkel kasutajalt mingeid juhiseid ei vaja. Seda nimetatakse mitmiktegumrezhiimiks. Programm on tegelikult vaid *.EXE fail kettal, mis kirjeldab, kuidas mingit ülesannet täita. Kui te selle programmi stardite, siis laaditakse tema kood mällu. Seda - täidetavat programmi - nimetatakse tegumiks (instance, task). Tegum omab kindlaid muutujate väärtusi, kuid kasutab oma ülesande täitmiseks oma programmi poolt kindlaks määratud viisi - algoritmi. Te võite ka operatsioonisüsteemis DOS laadida korraga mällu mitu programmi, kuid igal hetkel saab vaid üks neist korraga aktiivne olla ja protsessor ei suuda oma jõudehetkil teisi programme täita. Teised operatsioonisüsteemid aga, nagu näiteks UNIX ja OS/2, suudavad seda.

Mitmesuguste exec...() ja spawn...() funktsioonidega saab teisi programme või ka sama programmi veel kord mällu laadida ja uut tegumit luua. Funktsioonid exec...() laadivad teise programmi mällu ja stardivad selle. Funktsioonid spawn...() teevad sedasama ja jätkavad peale uue programmi lõppu vana programmi täitmist.

Kui te teate, kui palju argumente te uuele programmile üle andma peate, siis kasutage funktsioone:

int execl  (char *path, char *arg0, ..., NULL);
int execle (char *path, char *arg0, ..., NULL, char **env);
int execlp (char *path, char *arg0, ...);
int execlpe(char *path, char *arg0, ..., NULL, char **env);

või:

int spawnl  (int mode, char *path, char *arg0, ..., NULL);
int spawnle (int mode, char *path, char *arg0, ..., NULL, char *envp[]);
int spawnlp (int mode, char *path, char *arg0, ..., NULL);
int spawnlpe(int mode, char *path, char *arg0, ..., NULL, char *envp[]);

Funktsioonide exec...() esimene parameeter määrab starditava programmi täieliku nime koos tema kataloogiteega ja vajaduse korral ka kettaseadme nimega. Sellele järgnevad programmi parameetrid. Viimane parameeter on NULL, mis näitab, et sellele rohkem parameetreid ei järgne. Näiteks:

execl("C:\\NC\\ARJ.EXE", "a", "-va", "A:\\DOCS.ARJ", "C:\\DOCS\*.*", NULL);

Funktsioonid execle() ja spawnle() võimaldavad muuta ka uue tegumi keskkonnamuutujaid. Keskkonnamuutujad (environment variables) määratakse tavaliselt failis AUTOEXEC.BAT ja muudes *.BAT failides. Nende kuju on järgmine:

[SET] <muutuja nimi> = <väärtus>

Näiteks:

PATH=C:\DOS;C:\NC;C:\WINDOWS;C:\BORLANDC\BIN;

või

SET LIB=C:\BORLANDC\LIB;C:\BORLANDC\CLASSLIB\LIB;

Keskkonnamuutujaid kasutatakse näiteks kataloogide määramiseks, kust programmid otsivad mingeid andmeid sisaldavaid faile jms. Soovikorral võite salvestada sobivad muutujad koos uute väärtustega sümbolijadadesse, mis omakorda salvestatakse massiivi ja anda sellele massiivile näitav viit üle funktsioonile execle() või spawnle(). Kui te uuele programmile mingeid keskkonnamuutujaid ei määra, siis kasutab ta vana programmi keskkonnamuutujate väärtusi.

Funktsioonid execlp() ja spawnlp() ei vaja enam starditava programmi täielikku nime, vaid kasutavad selle programmi otsimiseks keskkonnamuutuja PATH väärtust .

Funktsioonid execlpe() ja spawnlpe() lubavad määrata uusi keskkonnamuutujaid ja kasutavad ka muutujat PATH.

Funktsioonid spawn...() vajavad veel parameetrit mode, mis määrab uue ja vana programmi koostöö viisi. See parameeter võib omada üht järgnevatest väärtustest.

Kui te aga ei tea täpset programmi parameetrite arvu, siis kasutage funktsioone:

int execv  (char *path, char *argv[]);
int execve (char *path, char *argv[], char **env);
int execvp (char *path, char *argv[]);
int execvpe(char *path, char *argv[], char **env);

või

int spawnv  (int mode, char *path, char *argv[]);
int spawnve (int mode, char *path, char *argv[], char *envp[]);
int spawnvp (int mode, char *path, char *argv[]);
int spawnvpe(int mode, char *path, char *argv[], char *envp[]);

Nimetatud funktsioonid erinevad eespooltoodutest vaid selle poolest, et nüüd ei anta iga parameeter otse funktsioonile üle, vaid salvestatakse sümbolijadade massiivi argv ja antakse seejärel üle kogu massiiv. See võimaldab määrata starditava programmi parameetrite arvu ja sisu alles vana programmi käigus.