|
int spawnlp(int mode,char *path,char *arg0,...,argn,NULL)
|
səhifə | 18/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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.
Dostları ilə paylaş: |
|
|