Limbajul c si C++ abc-doar


MS-DOS sau pentru operatii asupra acestora.Se poate utiliza si



Yüklə 4,6 Mb.
səhifə47/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   43   44   45   46   47   48   49   50   ...   55

MS-DOS sau pentru operatii asupra acestora.Se poate utiliza si

pentru a accesa si modifica filele,etc.


-356- [ dos.h - TIPURI DE DATE ]

FA_xxxx constante care desemneaza atributele DOS ale filelor.Pot fi:

FA_RDONLY atribut -pot fi doar citite

FA_HIDDEN -file ascunse (nu sunt afisate)

FA_SYSTEM -file sistem (pot apela sistemul)

FA_LABEL -etichete de volum

FA_DIREC -directoare

FA_ARCH -arhive
ffblk(C++) este o structura pentru blocul de control al filei (DOS)

are forma generala:

struct ffblk { char ff_reserved[21]; /*rezervat pentru DOS */

char ff_attrib; /*atributul gasit */

int ff_ftime; /*ora de arhivare a filei */

int ff_fdate; /*data de arhivare a filei */

long ff_size; /*dimensiunea filei */

char ff_name[13]; /*numele gasit pentru fila */

};

Pentru arhivarea datei si orei,ff_ftime si ff_fdate sunt la randul lor

niste structuri de 16 biti,subimpartite in campuri si utilizate pentru

preluarea oraei si a datei de arhivare.
_heaplen este o variabila globala care arhiveaza dimensiunea stivei

Valoarea acestei variabile de la inceputul programului determina dimen-

siunea stivei care va fi alocata pentru executia programului.Daca are

valoarea initiala zero(valoarea implicita),stiva va fi alocata la dimen-

siunea maxima posibila.Variabila _heaplen nu se utilizeaza pentru mode-

lele mari si pentru cele cu memorie extinsa(este aplicabila doar pentru

modelele tiny,small si medium).Modelele mari(compact,large si huge) nu

au stiva si nici _heaplen.

In modelele mici,segementul de date este impartit astfel:

data segment[small,medium]= global data + heap + stak (unde stak poate

fi modificata cu _stklen).

Daca _heaplen este zero,programul va aloca 64 K pentru segmentul de date

globale iar restul de memorie va fi impartit intre stiva (heap) si arhiva

(stak).Puteti utiliza _heaplen si _stklen pentru a gestiona spatiul de

memorie,dupa necesitati.
_ovrbuffer (C++) este o variabila globala care seteaza tamponul overlay

SINTAXA GENERALA este: unsigned _ovrbuffer=size;

Aceasta variabila se utilizeaza (doar in versiunile DOS pe 16 biti)

pentru a schimba dimensiunea tamponului de memorie utilizat pentru supra-

punerea modulelor de program(overlay buffer).Valoarea implicita este

dubla decat cel mai mare dintre modulele suprapuse.In majoritatea cazu-

rilor,aceasta dimensiune este suficienta.Pot exista insa si situatii in

care programul este subimpartit intr-un numar mare de module,care prin

suprapunere ocupa un spatiu mai mare decat dublul celui mai mare dintre

ele.Solutia este sa mariti dimensiunea tamponului de suprapunere(overlay)

De exemplu,pentru a schimba dimensiunea tamponului overlay,la 128 K se

va include in program urmatoarea comanda:

unsigned _ovrbuffer=0x2000;

Nu exista o formula pentru a determina dimesiunea ideala a tamponului.


-357- [ dos.h -TIPURI DE DATE ]

NFDS constanta pentru numarul maxim de descriptori ai filei
_osmajor este o variabila globala care contine numarul sistemului de

operare (Exemplu: pentru DOS 3.2 contine 3)
_osminor este o variabila globala care contine numarul minor al siste-

mului de operare (Exemplu: pentru DOS 3.2 contine 20)
_osversion este o variabila globala care contine versiunea completa a

sistemului de operare (Exemplu: pentru DOS 3.2 contine 3.2)
_psp este o variabila globala care contine adresa pentru prefixul

segmentului de program (memoria alocata pentru program)
BYTEREGS (Turbo C) este o structura pentru registrii de procesor (bytes)

are forma generala:

struct BYTEREGS { unsigned char al,ah,bl,bh;

unsigned char c1,ch,d1,dh;

};
WORDREGS (Turbo C) este o structura pentru registrii de procesor (words)

are forma generala:

struct WORDREGS { unsigned int ax,bx,cx,dx;

unsigned int si,di,cflag,flags;

};
REGPACK (C si C++) este o structura utilizata de functia intr pentru

salvarea registrilor.Are forma generala:

struct REGPACK { unsigned r_ax,r_bx,r_cx,r_dx;

unsigned r_bp,r_si,r_di;

unsigned r_ds,r_es,r_flags;

};
REGS (C si C++) este o uniune utilizata de functiile int86,int86x,

intdos si intdosx pentru citirea si/sau arhivarea registrilor.

Este formata din cele doua structuri BYTEREGS si WORDREGS si are

forma generala:

union REGS { struct WORDREGS x;

struct BYTEREGS h;

};
SREGS (C si C++) este o structura utilizata de functiile int86x,intdosx

si segread pentru a arhiva registrii pentru segmente

are forma generala:

struct SREGS { unsigned int es;

unsigned int cs;

unsigned int ss;

unsigned int ds;

};

Toate structurile pentru registri (BYTEREGS,WORDREGS,REGPACK,SREGS) sunt

destinate pentru citirea sau arhivarea datelor in si din registrii 8086.


-358- [ dos.h -TIPURI DE DATE ]

SEEK_xxx sunt constante care definesc punctul de plecare a unei sortari

pot avea urmatoarele valori:

SEEK_SET 0 Cautare de la inceputul filei

SEEK_CUR 1 Cautare de la pozitia curenta

SEEK_END 2 Cautare de la sfarsitul filei
_stklen este o variabila globala care determina lungimea arhivei(stack).

Se utilizeaza pentru toate modelele de memorie.Valoarea minima

posibila este de 128 words(256 bytes).Valoarea implicita este 4 K.

Se utilizeaza impreuna cu _heaplen pentru a determina modul de

subimpartire a memoriei (in modelele mici),sau singura,pentru a

determina spatiul alocat pentru stocarea datelor(in modelele mari)
time este o structura utilizata de functiile dostounix,gettime,settime,

unixtodos,pentru a arhiva ceasul sistemului (ora,minutul,secunda)

Are forma generala:

struct time { unsigned char ti_min; /* minutele */

unsigned char ti_hour; /* orele */

unsigned char ti_hund; /* sutimi de secunda */

unsigned char ti_sec; /* secundele */

};
_version este o variabila globala si contine numarul complet al versi-

unii sistemului de operare (Exemplu: pentru DOS 3.2 contine 3 si 2 )

SINTAXA GENERALA este: extern unsigned _version;

Numarul major al versiunii este arhivat in byte-ul inferior iar

numarul minor este arhivat in byte-ul superior(cel mai semnificativ)
xfcb este o structura utilizata pentru blocul extins de control al

filei MS-DOS.Are forma generala:

struct xfcb { char xfcb_flag;

char xfcb_resv[5];

char xfcb_attr;

struct fcb xfcb_fcb;

};

unde ultimul membru este o structura de tip fcb (vezi fcb).

Functiile si tipurile de date definite in fila de antet dos.h sunt

destinate exclusiv pentru comenzi,instructiuni si operatii care implica

sistemul de operare de tip DOS sau MS-DOS.Pot exista diferente destul de

semnificative intre diferitele versiuni de DOS,astfel incat este bine

sa consultati intotdeauna si manualul sistemului de operare DOS sub care

lucrati,sau sa consultati un specialist.

Versiunile actuale Visual C++,opereaza exclusiv in mediul de operare

Windows,deoarece necesita un port paralel pentru executarea aplicatiilor

grafice,astfel incat nu recunoaste functiile de tip DOS,care au fost

inlocuite cu functii sau clase de functii specifice.Nu apelati la intam-

plare functiile sistemului DOS,deoarece rezultatele obtinute pot fi

imprevizibile.Atunci cand sunt utile,sau indispensabile,testati functiile

DOS izolate,pentru a le integra ulterior in aplicatia dorita.


-359- [ process.h -abort() si execl() ]

BIBLIOTECA C -Fila antet (header)


-contine structurile si declaratiile functiilor spawn...() si exec...()

Functiile din aceasta fila au efect global asupra intregului proces de

calcul din aplicatie.Se utilizeaza pentru a lansa un nou program,subpro-

gram sau rutina independenta,sau pentru a intrerupe si/sau termina pro-

gramul aflat in executie.Functiile de acest gen,permit structurarea de

tip arborescent a programelor si aplicatiilor.
FUNCTIA abort()

-termina prematur executia programului

SINTAXA GENERALA este: void abort(void);

Functia intrerupe prematur programul aflat in executie si apeleaza functia

raise() (vezi ) pentru a trimite un mesaj software de intrerupe-

re a programului,de tip SIGABRT(definita in signal.h).Daca nu exista nici

un handler corelat cu SIGABRT,functia abort() scrie in streamul stderr

mesajul de eroare: "Abnormal program termination" si apoi intrerupe pro-

gramul prin apel al functiei _exit() cu codul 3 (_exit(3)).

Functia returneaza codul de exit 3 catre procesul parinte (cel din care

s-a facut intreruperea),sau catre sistemul de operare.

EXEMPLU: #include


#include

#include

int x;

main()

{ for (x=1;x<10;x++)

{ printf("x= %d \n",x);

sound(x*500);

delay(500);

nosound();

sleep(1);

if (x>6)

abort();

}

}

Functia este utilizata mai ales pentru iesire de urgenta din program in

cazul aparitiei unei erori grave (Exemplu: daca intervine o eroare de

format in cursul introducerii de date intr-un fisier,programul va executa

automat o comanda abort(),pentru a evita coruperea datelor din fisier).
FUNCTIA execl()

si [ execle(),execlp(),execlpe(),execv(),execve(),execvp(),execvpe() ]

-incarca si deruleaza alte programe (executabile)

SINTAXA GENERALA este:

int execl(char *path,char *arg0 *arg1,...,*argn,NULL [,char **env]);

Functiile din aceasta familie de functii,incarca in memorie si executa

programe sau subprograme,denumite si programe copil (child processes) sau

subrutine,care se suprapun peste programul parinte (sursa).Pentru incar-

carea si executia lor,trebuie sa existe suficienta memorie de operare

libera (atat pentru subprogram cat si pentru executie).

Prin pointerul *path se specifica explicit calea de acces la fila care

contine programul sau subrutina ce urmeaza sa fie executata.


-360- [ process.h -execl()... ]

Pentru calea de acces,functia foloseste urmatorul algoritm:

-daca nu este specificata extensia,functia cauta initial filele fara

extensie,apoi cele cu extensia .EXE,iar apoi cele cu extensia .COM si

executa fila izolata prin comanda de procesor COMSPEC(Windows) sau prin

COMMAND.COM(DOS).

-daca extensia este specificata,functia cauta exclusiv fila cu numele si

extensia corecta

Sufixele l,v,p si e sunt cele care disting membrii familiei de functii si

au urmatoarea semnificatie:

l -specifica transmiterea argumentelor arg0,arg1...argn ca argumente

separate.Tipic se utilizeaza atunci cand se cunoaste exact numarul

de argumente ce urmeaza sa fie transferate functiei.

v -specifica transmiterea argumentelor sub forma de arie de pointeri.

Tipic se utilizeaza atunci cand functia urmeaza sa fie utilizata cu

un numar variabil de argumente (in functie de necesitati).

p -specifica faptul ca functia va cauta fila in toate directoarele

specificate in calea de acces.In absenta acestui sufix,functia cauta

fila specificata doar in directorul curent.Daca in calea de acces nu

exista un parametru care sa specifice explicit directorul in care

se afla fila,functia va cauta initial in dierectorul curent si apoi

in restul directoarelor din calea specificata (Exemplu : C:\USR va

cauta in toate dirctoarele din USR ).

e -specifica faptul ca se poate utiliza si argumentul env,care poate fi

transferat subrutinei lansate pentru a modifica mediul de executie

al subrutinei (enviroment) (Exemplu: se executa programul cu un

anumit set de setari prestabilite a variabilelor globale).In absenta

acestui sufix,subprogramul lansat mosteneste automat mediul de ope-

rare al programului parinte (sursa).

Orice functie din familia exec...() trebuie sa contina si cel putin unul

dintre sufixele l sau v iar sufixele p si e sunt optionale.

Toate functiile exec...() trebuie sa transfere subprogramului lansat,cel

putin unul dintre argumente.Prin conventie,primul argument:arg0 sau arg[0]

este de obicei egal cu calea de acces specificata prin path,dar utilizarea

unui alt argumet nu determina o eroare.Astfel,primul argument al functiei

pointeaza de obicei calea de acces,iar urmatoarele (arg1,arg2...)pointeaza

spre siruri de caractere care formeaza o lista de argumente transferabile.

Caracterul NULL se utilizeaza pentru a semnaliza epuizarea listei.

Daca se utilizeaza si sufixul e,se adauga si argumentul env care este o

arie de pointeri de tip caracter spre liniile de comanda care vor configu-

ra mediul de operare.Fiecare element din arie este de forma:

envvar=value si contine un sir de caractere terminat prin NULL.

Ultimul element din arie este tot un carcter NULL (marcheaza sfarsitul).

Pentru specificarea argumentelor functiei,se pot utiliza maximul 128 bytes

(in versiunea DOS 16 biti) sau respectiv 260 bytes (in versiunea Win 32),

exclusiv caracterul NULL terminal.

In momentul apelarii unei functii exec...(),toate filele care au fost

deschise de catre procesul (programul) sursa,raman deschise si pentru

subprogram (procesul copil ).

Functia nu returneaza nimic daca este executata cu succes,sau returneaza

-1 in caz de eroare si seteaza errno(EACCES,EMFILE,ENOENT,ENOEXEC,ENOMEM)

Erorile pot fi identificate cu perror().


-361- [ process.h- _exit() si exit() ]

EXEMPLU: #include


#include

#include

main()

{ printf("Utilizam functia excl() pentru a lansa BGIDEMO !");

sleep(3);

execl("bgidemo.exe",0);

}

Functia este foarte utila,pentru a lasna programe si subrutine pregatito-

re,pentru a afisa mesaje si anunturi,pentru a actualiza programe mai vechi

sau pentru a suprapune doua programe,etc.
FUNCTIA _exit()

-termina executia unui program

SINTAXA GENERALA este: void _exit(int status);

Functia termina executia programului curent,fara ca sa inchida filele des-

chise,fara sa elibereze tampoanele de memorie si fara sa apeleze eventua-

lele functii de iesire.Argumentul utilizat pentru status este o valaore de

tip int care,deobicei este zero (0) pentru a indica terminarea normala a

programului,sau are o valoare pozitiva pentru a indica o eroare oarecare.

Functia nu returneaza valori.

EXEMPLU: #include


#include

#include

int x;

main()

{ printf("Programul se termina peste 5 secunde ! \n");

for (x=1;x<10;x++)

{ printf("nr secunde= %d ",x);

if (x==6)

_exit(0);

printf("au mai ramas: %d secunde \n",5-x);

sleep(1);

}

}

Functia se utilizeaza pentru iesirea de urgenta din program(functie de

protectie impotriva erorilor) sau pentru intreruperea proceselor defective

sau excesiv de laborioase.Se poate utiliza si pentru depanarea unor

programe (se intrerup cu _exit() si apoi se verifica valorile restante

din tampoanele de memorie ).
FUNCTIA exit()

-termina normal executia programelor

SINTAXA GENERALA este: void exit(int status);

Functia termina executia programului (processului ) aflat in curs de exe-

cutie.Inainte de terminare,inchide toate filele deschise,salveaza datele

in tampoanele de memorie (flushall()) si executa toate functiile de iesire

inregistrate cu atexit().

Valoarea pentru status specifica modul de terminare a programului.Frecvent

status 0 indica terminarea normala a programului iar valorile nonzero

indica diverse tipuri de eroare.


-362- [ process.h -spawnle()... ]

Functia nu returneaza valori.

EXEMPLU: #include


#include

#include

int x;

int tampon[15];

sunet1()

{ sound(3000);

delay(1000);

nosound();

}

main()

{ atexit(sunet1);

for (x=1;x<10;x++)

tampon[x]=x;

printf("Tamponul a fost initializat cu valorile: \n");

for (x=1;x<10;x++)

{ printf("x[%d]=%d \n",x,x);

if (x==5)

{ printf(" ... etc");

sleep(1);

exit(0);

}

sleep(1);

}}
FUNCTIA spawnl()

si[spawnle(),spawnlp(),spawnlpe(),spawnv(),spawnve(),spaunvp(),spawnvpe()]

-creaza si executa alte file si programe denumite procese copil (child).

SINTAXA GENERALA este:

int spawnl(int mode,char *path,char *arg0,*arg1,...,*argn,NULL);

Functia este descrisa pe larg la fila impreuna cu functiile

speciale din versiunea C++ (vezi pagina 122-124).

EXEMPLU: (pentru versiunea Turbo C)

#include


#include

main()

{ printf("primul program lansat: \n");

sleep(2);

spawnlp(P_WAIT,"ceil1.exe",0);

sleep(2);

printf("Al doilea program lansat: \n");

spawnlp(P_WAIT,"abort1.exe",0);

}

Incercati sa inlantuiti si sa lansati un numar de programe executabile

dintre cele realizate de d-voastra (din directorul OUT).

Functia este extrem de utila pentru a lansa si executa serial,sau chiar

si in paralel,mai multe aplicatii,subrutine sau programe.Verificati cu

atentie spatiul de memorie,astfel incat prin executia simultana a pro-

gramelor sa nu suprascrieti tampoanele sau sa epuizati memoria.Atentie

sa nu existe variabile declarate cu acelasi nume (in programe diferite).


-363- [ process.h -system() si wait() ]

FUNCTIA system()

-lanseaza o comanda pentru sistemul de operare (MS-DOS sub Windows 95)

SINTAXA GENERALA este: int system(const char *command);

Functia este descrisa pe larg la fila (vezi pagina 168-169)

EXEMPLU: (pentru versiunea Turbo C )

#include


#include

main()

{ system("dir");

sleep(3);

}
CONSTANTE,VARIABILE GLOBALE si TIPURI DE DATE

P_xxxx sunt constante destinate pentru functia spawn...() Pot fi:

P_WAIT Procesul copil ruleaza separat,cel parinte asteapta pana

la sfarsitul procesului copil

P_DETACH Ambele procese se deruleaza concurent in background [C++]

P_NOWAIT Ambele procese se deruleaza concurential (simultan)

P_NOWAITO Ambele procese se deruleaza concurential,dar procesul[C++]

copil nu este salvat

P_OVERLAY Procesul copil se suprapune peste procesul parinte (il in-

locuieste) astfel incat procesul parinte nu mai exista.
_psp este o constanta care contine adresa segmentului de prefix al

programului (doar in versiunea Turbo C)

Versiunea C++ include si un numar suplimentar de functii,printre care:

_beginthread(),beginthreadNT(),_c_exit(),_cexit(),cwait(),_endthread()

getpid(), si wait() care adauga noi valente functiilor prezentate mai sus.

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   43   44   45   46   47   48   49   50   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin