Limbajul c si C++ abc-doar


int spawnlp(int mode,char *path,char *arg0,...,argn,NULL)



Yüklə 4,6 Mb.
səhifə18/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   14   15   16   17   18   19   20   21   ...   55

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

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

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[]);

unde : mode -este modul de executie dupa apelarea subprogramului

path -este calea de acces la subprogram

arg -este lista pointerilor spre argumentele functiei

Prin mode se determina tipul de actiune pentru programul principal ce se

va aplica la apelarea subprogramului lansat prin functia spawnl() si

poate avea una dintre urmatoarele valori:

P_WAIT -pune programul principal pe o linie de asteptare,pana cand

cand subprogramul lansat este executat complet

P_NOWAIT -continua executia programului principal simultan cu exe-

cutia subprogramului lansat.In acest caz se returneaza

numarul de identificare al procesului executat astfel incat

programul principal sa poata fi intrerupt prin cwait sau

wait pentru a astepta executia subprogramului.Aceasta

optiune este implementata doar in versiunile pe 32 de biti,

in versiunile WIN 16 si DOS 16 returneaza o eroare.

P_NOWAITO -este identica cu P_NOWAIT cu diferenta ca nu returneaza

numarul de identificare al procesului iar programul princi-

pal nu poate fi intrerupt prin cwait sau wait pentru a as-

tepta executia subprogramului.

P_DETACH -este identica cu P_NOWAITO cu diferenta ca subprogramul se

executa in background(fundal) fara nici un acces de la tas-

tatura si fara afisare pe ecran (rutine automate)

P_OVERLAY -suprapune subprocesul peste locatia de memorie ocupata an-

terior de catre programul principal(suprascrie datele).
Calea de acces trebuie sa cuprinda numele subprogramului,care va fi cautat

dupa algoritmul standard al sistemului de operare:

-daca nu se specifica extensia,atunci se va cauta fila cu acelasi nume,

iar daca nu se gaseste se vor verifica initial filele cu extensia EXE,

apoi cele COM si in final cele cu extensia BAT.

-daca se specifica extensia se va cauta doar fila care corespunde exact

-daca se specifica doar punctul(fara extensie),se va cauta doar fila

care are acelasi nume fara nici o extensie -se exclud filele cu extensie

-daca directorul nu se specifica explicit,atunci functiile din familia

spawn() care contin si sufixul p (spawnlp,spawnlpe,spawnvp,spawnvpe) vor

cauta in directorul curent iar apoi in directoarele setate in variabila

de sistem PATH a mediului de operare.

Este bine sa precizati calea de acces cat mai explicit.


-123- [stdio.h - spawnve()]

Toate functiile din familia spawn...() au acelasi rezultat,adica lanseaza

un proces secundar sau un subprogram,dar exista mici diferente determinate

de sufixul p,l,v sau e sau de o combinatie a lor,dupa cum urmeaza:

p -functia va cauta fila apelata si in directoarele specificate in

variabila PATH a sistemului de operare.Fara acest sufix,functia

nu va cauta fila apelata decat in directorul curent

l -argumentele pointerilor arg0,arg1...argn sunt transferate functiei

ca argumente distincte.Se utilizeaza atunci cand se conosc in

avans argumentele ce vor fi transferate functiei.

v -argumentele pointerilor arg0,arg1...argn sunt transferate functiei

sub forma de arie de pointeri.Se utilizeaza atunci cand se vor

transfera functiei un numar variabil de argumente (necunoscut

inainte de apelarea functiei)

e -permite utilizarea argumentului envp prin care se poate modifica

mediul de memorie in care se executa subprogramul apelat.In absenta

sufixului e,subprogramul mosteneste automat acelasi mediu de memo-

rie cu cel in care se executa programul principal(nu poate apela

un alt mediu de memorie encapsulat)

Fiecare functie din familia spawn...() trebuie sa contina unul dintre

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

De exemplu,functia spawnvpe() utilizeaza o arie de pointeri,cauta fila in

toate directorele specificate in PATH si accepta argumentul envp pentru

modificarea mediului de memorie la executarea subprogramului.

In toate functiile spawn...(),trebuie sa se transfere subprogramului

apelat cel putin un argument.In caz ca doriti ca lista de argumente ce se

transfera subprogramului sa fie goala,trebuie ca arg0 sau arg[0] sa fie

NULL.

Daca se utilizeaza sufixul l,argumentul arg0 pointeaza de obicei spre

path iar arg1...argn pointeaza spre sirurile de caractere ce vor forma

noua lista de argumente.Optional se poate adauga un caracter NULL dupa

ultimul argument(argn) pentru a marca sfarsitul listei.

Daca se utilizeaza sufixul e,atunci se transfera prin argumentul envp

noua lista de setari pentru mediul de memorie.Argumentul envp este o

arie de pointeri de tip caracter in care fiecare element pointeaza spre

un sir de caractere terminate prin caracterul NULL,de forma envvar=valoarea

unde envvar este numele variabilei de mediu iar valoarea este sirul de

valori utilizat pentru noua setare.Ultimul element din fiecare sir este de

tip NULL.Daca intregul argument envp este evaluat ca NULL,atunci subpro-

gramul apelat va utiliza acelasi mediu de memorie ca si programul principal

Lungimea totala a argumentelor din lista arg0,arg1...argn,inclusiv spatiile

ce separa argumentele trebuie sa fie mai mica de 128 caractere in versiunea

DOS sau 260 de caractere in versiunea WINDOWS.

La apelarea unei functii spawn...(),toate filele deschise in subproces

raman deschise(trebuiesc inchise cu comenzi speciale).

Daca functia a fost executata cu succes,returneaza statutus-ul de proces

zero=terminat normal sau -1=eroare in caz ca modul de executie este P_WAIT,

sau returneaza numarul de identificare al procesului executat (ID) in caz

ca modul de executie este P_NOWAIT sau P_NOWAIT).

In caz de eroare,variabila errno este setata la: E2BIG(arg list too long),

EINVAL(invalid argument),ENOENT(path or file name not found),ENOEXEC(exec

format error),ENOMEM(not enough memory).


-124- [ stdio.h - tempnam() ]

EXEMPLU: #include

#include


#include

#include

void spawnl_example();

main()

{

int result;

result=spawnl(P_NOWAIT,"td.exe","td.exe",NULL);

if (result == -1)

{

perror("Error from spawnl");

exit(1);

}

sleep(15);

}

Acest exemplu utilizeaza functia spawnl() pentru a apela utilitarul

Turbo-Debugger din C++ sub forma de subprogram al aplicatiei.Pentru

iesirea corecta din aplicatie,selectati fereastra in care este apelat

subprogramul Turbo Debugger,apoi selectati OK din fereastra de prezen-

tare a versiunii si iesiti din program cu File si Quit,iar apoi cu

Ctrl+C din fereastra MS-DOS.Daca nu inchideti corect subprogramul,acesta

va ramane rezident in memorie pana la inchiderea calculatorului.In mod

similar se pot lansa consecutiv (in cascada) doua sau mai multe aplicatii

sau programe executabile.

FUNCTIA tempnam()

-creaza un nume unic pentru o fila,in directorul specificat

SINTAXA GENERALA: char *tempnam(char *dir,char *prefix)

Functia creaza un nume unic pentru o fila,in orice director.Nu se creaza

automat si fila unica cu numele respectiv,functia tempnam() verifica doar

daca nu exista deja o fila cu numele respectiv.

Functia va incerca sa utilizeze urmatoarele directoare(in ordine);

-Directorul specificat prin TMP in variabila de mediu de memorie

-Directorul specificat prin dir(argumentul functiei)

-Definitia pentru P_tmpdir din stdio.h(nu se poate redefini)

-Directorul curent de lucru al programului

Daca oricare dintre directoarele de mai sus este NUL,nedefinit sau nu

exista,atunci functia va utiliza directorul urmator(sare la urmatorul).

Prin prefix se specifica prima parte a numelui,prin maxim 5 caractere,fara

punct(.).Numele unic se va crea prin concatenarea directorului cu prefixul

si cu 6 caractere unice.Spatiul necesar pentru numele nou creat se va

aloca prin malloc(),iar in momentul in care numele creat nu mai este nece-

sar va putea fi eliberat prin free().

Daca creati o fila unica pentru care utilizati numele construit cu functia

tempnam(),atunci va trebui sa stergeti numele filei (de exemplu cu remove)

deoarece tempnam() nu sterge numele automat(ramane rezident in memorie).

Daca functia a fost aplicata cu succes,returneaza un pointer spre nume-

le creat,iar in caz contrar returneaza NULL.Pointerul poate fi utilizat

pentru stregerea numelui cu free().


-125- [ stdio.h - ungetc() ]

EXEMPLU: #include

#include

#include

#include

FILE *fila1;

char *nume1;

main()

{

nume=tempnam("E\tmp","wow");

printf("%s\n",nume1);

free(nume1);

sleep(5);

}

Versiunea Visual C++,accepta si functiile similare: _wtempnam(),tmpnam()

si _wtmpnam() care utilizeaza exclusiv majuscule pentru construirea nume-

lui unic,sau respectiv utilizeaza exclusiv caractere arbitrare(tmpnam).

In cazul functiei tmpnam,pointerul returnat este orientat(pointeaza) spre

un tampon de memorie intern(care selecteaza caractere aleatorii).

Functia tmpnam are sintaxa: char *tmpnam(char *string)

Daca se specifica si directorul,atunci numele construit poate fi utilizat

pentru a crea o fila in alt director decat directorul curent.Functia uti-

lizeaza constantele P_tmpdir si L_tmpnam care permit construirea de pana

la 65535 de denumiri diferite prin apelari succesive.
FUNCTIA ungetc()

-reintroduce un caracter in stream-ul de intrare a datelor(in flux)

SINTAXA GENERALA este: int ungetc(int c,FILE *stream);

Functia introduce in flux caracterul desemnat prin int c(numarul de ordine

al caracterului ASCII),cu conditia ca fluxul(fila) sa fie deschis pentru

scriere (cu optiunea w din fopen()).Caracterul reintrodus in flux va putea

fi returnat la proxima apelare prin getc() sau fread().Astfel se poate

adauga un caracter in fila,in orice situatie,dar apelarea succesiva a

functiei ungetc() fara ca sa fie apelata apoi prin getc() poate duce la

rezultate imprevizibile (se pierd restul datelor din fila).Astfel,dupa

reintroducerea caracterului prin ungetc(),acesta trebuie sa fie citit cu

getc() sau read().In cazul in care se apeleaza una dintre functiile:

fflush(),fseek(),fsetpos() sau rewind(),atunci orice caracter introdus in

memorie prin ungetc() va fi sters automat si nu va putea fi apelat prin

getc().

Daca functia este executata cu succes,returneaza caracterul reintrodus,

iar in caz de eroare returneaza EOF.

Se va evita utilizarea functiei in aplicatiile WIN 32 si WIN 32 GUI,

deoarece la reintroducerea caracterului in memorie,functia sterge automat

indicatorul EOF.

Caracterul va fi introdus in prima pozitie a memoriei,astfel incat la

citirea ulterioara a memoriei va fi primul caracter returnat.Dupa apelarea

functiilor fflush(),fseek(),fsetpos() si rewind() se sterge orice caracter

introdus prin ungetc() iar indicatorul EOF revine la pozitia initiala.

In caz ca se apeleaza fara succes prin ungetc() file binare,indicatorul

EOF va fi decrementat cu 1 pentru fiecare apel nereusit,iar in caz ca a

fost in pozitia zero va accepta o valoare nedefinita.


-126- [ stdio.h - tmpfile() ]

Versiunea Visual C++ accepta si functia ungetwc() care opereaza doar cu

majuscule iar in caz de eroare returneaza WEOF.

Functia este foarte utila pentru aplicatiile care opereaza cu nume de

file si fisiere,deoarece permite blocarea la citire a fisierelor prote-

jate(adauga in fata numelui un caracter neinterpretabil) sau permite

corectarea sau completarea numelui unui fisier.

EXEMPLU: #include

#include

#include

FILE *text;

int y;

char mesaj[80];

main()

{

text=fopen("Fila1.txt","w+");

fputs(" Text exemplificativ",text);

printf("Functia ungetc() introduce un caracter in memorie:");

for (y=0;y<23;y++)

{

fseek(text,0,SEEK_SET);

ungetc(63+y,text);

fgets(mesaj,y,text);

printf("%s\n",mesaj);

sleep(1);

}

sleep(5);

}
FUNCTIA tmpfile()

-deschide o fila binara temporara

SINTAXA GENERALA este: FILE *tmpfile(void);

Functia creaza o fila binara temporara si o deschide pentru actualizare

(cu w + b).Daca nu schimbati directorul dupa crearea unei file temporare,

aceasta se va inchide automat la terminarea programului (sau daca este

inchisa cu o comanda specifica) sau prin apelarea _rmtmp().

Daca a fost executata cu succes,functia returneaza un pointer spre

fila temporara creata,iar in caz de eroare returneaza NULL.

Filele binare temporare sunt utile pentru calcule,deoarece elibereaza

memoria de operare la inchiderea filei(evita blocarea memoriei).

EXEMPLU: #include

#include

FILE *text1;

long double x;

main()

{ text1=tmpfile();

printf("Pointerul spre fila text1 este: \n");

printf("%s\n",text1);

printf("Calculul pentru PI/e este: \n");

x=3.14/2.73;

printf("%LG",x);

sleep(5); }


-127- [ stdio.h - vprintf() ]

FUNCTIA vprintf()

-scrie date formatate in dispozitivul de iesire a datelor(stdout)

SINTAXA GENERALA este:

int vprintf(const char *format,va_list arglist);

Pentru apelarea functiei este necesara si fila antet care

contine macrourile necesare pentru lista de argumente variabile.

Functia este similara cu functia printf() cu deosebirea ca accepta un

pointer spre o lista de argumente variabile in locul unui pointer spre

argumentul unei liste.Explicit,acest fapt inseamna ca se pot utiliza un

numar neprecizat de argumente in cadrul functiei,spre deosebire de functia

printf() in care fiecare argument al functiei trebuie sa fie insotit de un

specificator de format.Functia este foarte utila atunci cand nu se stie

exact numarul de argumente pentru care se va aplica functia,sau atunci

cand numarul de argumente este variabil de la caz la caz.Functiile de

acest gen[vfscanf(),vfprintf(),vsprintf(),vscanf()...] sunt cunoscute si

cu numele de functii I/O alternative.La aceste functii specificatorul de

format se va aplica la toti membrii din lista de argumente specificata

prin va_list arglist,iar datele vor fi afisate pe dispozitivul de iesire

(ecran,imprimanta etc.).Numarul specificatorilor de format trebuie sa

fie egal cu cel al listelor de argumente.

Daca functia a fost executata cu succes,returneaza numarul de bytes

scrisi iar in caz contrar returneaza EOF.

EXEMPLU: #include

#include

#include

int x;

int lista(char *primul,...)

{

va_list argumente;

int nr;

va_start(argumente,primul);

nr=vprintf(primul,argumente);

va_end(argumente);

return(nr);

}

main()

{

int numar[7];

numar[1]=3072254;

numar[2]=1534426;

numar[3]=1057731;

numar[4]=2217739;

char *sir="Numar de telefon=";

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

{

lista("%s %d \n",sir,numar[x]);

sleep(5);

}

}

Functia va parcurge argumentele din lista de argumente,incepand cu

primul.Se pot utiliza algoritmi de parcurgere a listei de argumente.


-128- [ stdio.h - vscanf() ]

Pentru utilizarea listelor cu argumente variabile sunt utile macrourile

va_arg,va_end si va_start definite in care permit accesul la

membrii listei de argumente variabile.Cu ajutorul lor,lista de argumente

va fi parcursa pas cu pas,atunci cand functia apelata nu cunoaste numarul

sau tipul de argumente din lista.

Pentru lista de argumente variabile se utilizeaza tipul de date va_list

definit tot in .Sintaxa generala pentru cele trei macrouri este:

void va_start(va_list ap,lastfix);

type va_arg(va_list ap,type);

void va_end(va_list ap);

unde: ap: -este pointerul spre primul argument din lista

lastfix: -este ultimul argument apelat(transferat functiei)

Prin va_start se incepe rutina de citire a argumentelor si trebuie ape-

lata inainte de a apela va_arg sau va_end.

va_arg dezvolta expresia pentru tipul de data si respectiv valoarea din

argumentul transferat functiei(valoarea curenta).Variabila ap din va_arg

trebuie sa fie aceeasi cu cea initializata prin va_start.va_arg nu se

poate aplica pentru tipurile de date char,unsigned char si float.

La prima utilizare,va_arg returneaza primul argument din lista si apoi

la fiecare utilizare succesiva returneaza argumentul urmator.La fiecare

apelare va_arg incrementeaza valoarea variabilei ap pentru a trece la

elementul urmator.

va_end se utilizeaza pentru terminarea normala a executiei functiei.Poate

modifica valoarea variabilei ap de asa maniera incat sa nu poata fi reuti-

lizata decat dupa reapalearea va_start.Se utilizeaza de obicei doar dupa

ce va_arg a epuizat de evaluat toate argumentele din lista(in caz contrar

se pot pierde date).

va_start si va_end nu returneaza nici o valoare iar va_arg returneaza va-

loarea argumentului curent din lista de argumente(cel spre care este

orientat pointerul ap).

Constantele se pot include in algoritmi variati de parcurgere a listei

de argumente,in functie de preferintele programatorului.Un exemplu simplu

si clar este prezentat la functia vscanf()(vezi mai jos).
FUNCTIA vscanf()

-citeste si formateaza date din stdin(dispozitivul de intrare a datelor)

SINTAXA GENERALA este:

int vscanf(const char *format,va_list arglist);

Clasic se utilizeaza pentru a prelua date de la tastatura sau din retea.

Functia este similara cu scanf(),cu deosebirea ca accepta o lista de

argumente variabile (de tip va_list) pentru arhivarea datelor preluate.

Functia este o alternativa pentru scanf(),atunci cand dorim sa preluam un

numar necunoscut de date.Functia necesita si fila antet in care

sunt arhivate macrourile pentru va_list.

Functia citeste o serie de campuri de date,caracter cu caracter,apoi fie-

care camp citit este formatat corespunzator cu formatul specificat prin

*format in definitia functiei si in final datele sunt arhivate la adresa

de memorie specificata prin va_arglist.Pentru fiecare adresa trebuie sa

existe un specificator de format.Dupa executie,functia returneaza numarul

de campuri de date citite,formatate si arhivate.Daca datele nu pot fi

arhivate functia returneaza 0 ia la sfarsitul filei returneaza EOF.


Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   14   15   16   17   18   19   20   21   ...   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