Upload
emilian-necula
View
243
Download
0
Embed Size (px)
Citation preview
8/19/2019 Retele de Calculatoare - Lab1
1/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l
Laborator 1
Prezentarea tematicii generale a laboratoarelor si a sistemului de evaluare
Recapitulare bash. Comenzi uzuale
Recapitulare programare C sub Linux
Generalitati
Rutine de sistem pentru manipularea fisierelor
Manipularea fisierelor prin functii de librarie Lucrul cu directoare
Managementul memoriei
Exercitii
1. Recapitulare bash. Comenzi uzuale
O posibila definitie pentru un shell ar fi cea de interpretor de comenzi ce asigura o interfata intre utilizator si sistemul de operare. Bash
(Bourne again shell) este unul din cele mai utilizate shell-uri de consola UNIX la momentul curent si totodata cel implicit in majoritatea
distributiilor de Linux existente.
Comenzile de la nivelul shellului pot fi interne (implementate in cadrul shellului) sau externe (reprezinta simple programe consola). Ca si
primele si cele din a doua categorie pot fi rulate in mod normal prin simpla apelare a comenzii (cu optiuni si parametri dupa caz), fiindpozitionati in orice director al sistemului, chiar daca nu sunt proprii shellului. Apelul din orice director este posibil deoarece shellul va cauta
comanda in directoarele specificate prin intermediul variabilei de sistem PATH, iar in mod uzual, dupa instalare aceasta variabila va include
si directoarele ce contin majoritatea comenzilor. Continutul variabilei PATH poate fi consultat (ca orice alta variabila de fapt) prin
intermediul apelului echo $PATH . Evident, in cazul in care variabila PATH nu contine calea spre directorul unde se regaseste comanda,
aceasta nu va putea fi apelata decat folosind calea completa plecand de la radacina / , sau o cale relativa la directorul curent . sau la cel
parinte ..
Aducem aminte cu acest prilej directoarele ce se regasesc in cadrul distributiilor standard de Linux:
/ - directorul radacina
bin - diverse executabile necesare sistemului, aici aflandu-se de exemplu shellurile si comenzile externe
boot - fisiere necesare la incarcarea sistemului, printre care si imaginea binara a kernelului sistemului de operare
dev - f isiere utilizate pentru interfatarea cu dispoztivele sistemului (fizice si logice)
etc - fisiere de configurare ale sistemului cum ar fi /etc/passwd - informatii despre utilizatori, /etc/group - informatii despre grupurile de
utilizatori, /etc/services - informatii despre serviciile de retea (indicativele numerice ale porturilor), /etc/protocols - protocoalele de retea
suportate
home - subdirectoarele utilizatorilor
lib - librarii partajabile ce sunt utilizate de sistem sau de catre diverse aplicatii
mnt - sisteme de fisiere temporar atasate arborelui de directoare curent (montate utilizand comanda mount) in vederea accesarii, cum
ar fi de exemplu cdrom-ul sau partitiile de windows
proc - intrari virtuale corespunzatoare proceselor din sistem cu informatii despre acestea si date despre resursele utilizate (CPU, RAM)
sbin - executabile de administrare destinate utilizarii de catre root
tmp - director pentru datele temporare
usr - aplicatii destinate utilizatorilor sistemului
usr/bin - executabile ale aplicatiilor
usr/doc - documentatie pentru aplicatii
usr/include - fisiere header pentru dezvoltarea de programe C/C++
usr/lib - librarii utilizate de aplicatii
usr/local - aplicatii ce in mod normal sunt destinate doar utilizarii pe masina locala (ca exemplu directorul usr poate fi plasat fizic pe alta
masina si partajat de mai multe statii de lucru; in acest caz aplicatiile de pe masina curenta vor fi instalate in usr/local)
usr/sbin - alte executabile decat cele din sbin pentru administrarea sistemului
usr/src - sursele aplicatiilor
8/19/2019 Retele de Calculatoare - Lab1
2/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 2
var - fisiere de dimensiune variabila ce se modifica frecvent (cum ar fi log-urile de exemplu)
Informatii de baza depre o comanda, optiunile si parametrii ei, se pot obtine in general prin rularea comenzii cu optiunea --help, suportata
in majoritatea cazurilor. Informatii detaliate despre comanda pot fi obtinute prin apelul man comanda sau info comanda.
1.1. Comenzi pentru operatii asupra sistemului de fisiere
ls - Listeaza fisierele dintr-un director, implicit cel curent. Folosind optiunea -l intrarile despre fisiere sunt afisate in format detaliat.
Optiunea -a are ca rezultat si afisarea fisierelor ascunse (al caror nume incepe cu .)
stat [optiuni] [cale] - Afiseaza diverse informatii in functie de optiunile date despre fisierul/directorul aflat in calea introdusa ca
parametru
cp [sursa] [destinatie] - Copie fisierul sursa in locatia destinatie. Comanda poate avea si rol de redenumire in cazurile unde calea
destinatie este terminata cu (sau chiar reprezinta) un nume de fisier. Comanda este utilizata si in copierea directoarelor, caz in care
este folosita in general optiunea -r ce are ca efect copierea recursiva si a subdirectoarelor incluse.
mv [sursa] [destinatie] - Muta sursa in destinatie. Are practic acelasi efect ca si cp, cu deosebirea ca sursa este stearsa ulterior
operatiei de mutare
rm [cale] - Sterge fisierul specificat in cale. Pentru ca apelul comenzii sa nu necesite o confirmare aditionala se utilizeaza optiunea -f
(force). Pentru stergerea directoarelor se foloseste optiunea -r pentru ca stergerea sa se realizeze recursiv si la nivel de subdirectoare.
cd [cale] - Schimbarea caii curente
mkdir [cale] - Crearea directorului specificat in cale
Pentru mai multe informatii asupra comenzilor enumerate consultati manualul.
1.2. Comenzi pentru operatii cu fisiere text
cat [fisier] - Apelata in acest mod afiseaza continutul intregului fisier pe ecran (destinatia principala a comenzii este de fapt de a
concatena fisiere)
less [fisier] - Afiseaza continutul fisierului pagina cu pagina, permitand actiuni avansate cum ar fi de exemplu cautarea in cadrul
fisierului.
head [fisier] - Afiseaza primele linii din cadrul fisierului (implicit 10, numarul acestora se poate specifica prin optiunea -n; ex: -n9
pentru 9 linii)
tail [fisier] - Similar cu head pentru ultimele linii din cadrul fisierului
grep [expresie regulata] [fisier] - Cauta si afiseaza liniile din cadrul fisierului care respecta expresia regulata.
cut [optiuni] [fisier] - Extrage anumite campuri din liniile unui fisier pe baza optiunilor selectate.
diff [fisier1] [fisier2] - Compara fisierele si evidentiaza diferentele
wc [fisier] - (word count) Afiseaza numarul de linii, cuvinte si caractere dintr-un fisier
Pentru mai multe informatii asupra comenzilor enumerate consultati manualul.
Pentru editarea fisierelor text sunt disponibile la nivelul shellului diverse editoare mai simple si usor de utilizat cum ar fi nano, mcedit sau
mai complexe ca emacs sau vim.
1.3. Drepturi de acces
Drepturile de acces asupra unui fisier sunt vizibile in urma apelului comenzii ls cu optiunea -l. Acestea pot fi observate in primul camp
dintr-o intrare corespunzatoare unui fisier. Acest camp ce contine 10 caractere este format din patru subcampuri. Primul subcamp este
format dintr-un singur caracter ce identifica tipul de fisier ('-' fisier normal, 'd' director, 'p' pipe cu nume, etc). Urmatoarele subcampuriidentifica drepturile de acces asupra fisierului. Fiecare dintre subcampurile ce indica drepturile sunt formate din cate trei caractere ce pot f
'-' in caz ca nu exista un anumit drept, sau respectiv in ordine dupa semnificatie: 'r' exista drept de citire, 'w' exista drept de scriere si 'x'
exista drept de executie. Un subcamp ce ar indica deci drepturile complete ar fi 'rwx'. Primul dintre subcampurile de drepturi este asociat
proprietarului fisierului, urmatorul grupului de care apartine acesta, si ultimul restului de utilizatori. Astfel un set de drepturi de acces de
citire, scriere si executie pentru proprietarul unui fisier obisnuit, si doar de citire in rest ar arata in felul urmator: -rwxr--r-- .
In cazul directoarelor, dreptul de executie se refera la dreptul de a schimba calea curenta spre directorul respectiv si de a accesa efectiv
continutul acestuia, nu de a lista continutul acestuia (acesta fiind dreptul de citire). Cand pentru un director, in locul dreptului de executie
'x', se intalneste 't', inseamna ca respectivul director are un asa numit bit sticky setat. Aceasta semnifica faptul ca stergerea sau
modificarea fisierelor din cadrul acelui director pot fi efectuate doar de catre proprietarii acestora.
Alta valoare ce poate fi intalnita in locul dreptului obisnuit de executie 'x', este 's', ce indica, dupa localizarea in subcampul de drepturi,
8/19/2019 Retele de Calculatoare - Lab1
3/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 3
faptul ca un fisier are setat un bit SUID (Set User ID) sau un bit SGID (Set Group ID). Acest bit arata faptul ca executia fisierului va fi
realizata de oricine cu permisiunile proprietarului, respectiv grupului de care apartine. Utilizarea principala a acestui mecanism este de a
permite altor utilizatori sa execute o comanda ce necesita drepturi de root.
Modificarea drepturilor de acces se poate realiza prin intermediul comenzii chmod [categorie utilizatori] [+-=] [drepturi] [cale]. Categoria
utilizatori arata caror utilizatori (subcamp din campul drepturilor) li se aplica modificarea si poate fi 'u' - proprietar, 'g' - grup, 'o' - ceilalti
sau 'a' - toate categoriile. '+' , '-' sau '=' indica adaugarea, eliminarea, sau setarea directa a unor drepturi fata de, sau respectiv in locul
celor existente deja. Drepturile sunt specificate prin caracterele asociate specificate deja mai sus ('r', 'w', 'x', etc). Urmatorul argument
reprezinta calea spre fisierul sau directorul asupra caruia se realizeaza modificarea drepturilor. Comanda chmod poate fi apelata si utilizan
valori octale specificate direct pentru setarea drepturilor pentru cele trei categorii de utilizatori. Pentru mai multe informatii, consultati
manualul.
1.4. Redirectarea intrarilor si iesirilor
Dizpozitivile logice de intrare/iesire sunt urmatoarele: intrarea standard - stdin, de unde se citesc datele de intrare, avand asociata implici
tastatura; iesirea standard - stdout, unde sunt afisate datele de iesire, avand asociat implicit terminalul si iesirea de eroare standard -
stderr, unde sunt afisate erorile, avand asociat implicit deasemeni terminalul.
Redirectionarea intrarilor si iesirilor se poate face la nivelul shellului prin intermediul unor operatori de redirectare. Astfel, redirectarea
intrarii se realizeaza prin intermediul operatorului ''.
Extinzand exemplul anterior, [program] < [fisierin] > [fisierout], pe langa redirectarea intrarii, va scrie datele de iesire in fisierout, in loc
de a le afisa la nivelul terminalului. Daca pentru redirectarea iesirii se foloseste operatorul '>>', datele vor fi adaugate la sfarsitul noii
destinatii de iesire, fara a suprascrie fisierul. Redirectarea iesirii de eroare se face prin operatorul '2>'.
Redirectarea iesirii unei comenzi, ca intrare pentru o alta comanda, se poate face intr-un singur pas prin utilizarea mecanismului pipe,
prin inlantuirea comenzilor, separate de operatorul '|'. Spre exemplu, daca ne-am afla intr-un director ce contine foarte multe fisiere, am
putea afisa continutul acestuia, treptat, utilizand ls | less .
2. Programare C sub Linux. Generalitati
Compilarea unei surse C sub Linux se va realiza utilizand gcc (in cazul unei surse C++ compilatorul este g++). Apelarea gcc pasand ca
argument un fisier C fara o alta optiune, de exemplu:
gcc file.c
va produce (in cazul in care nu sunt intalnite erori) un executabil cu numele implicit a.out plasat in directorul curent, in urma compilarii s
linkarii fisierului initial.
Pentru a specifica un nume pentru fisierul output se foloseste optiunea -o urmata de acest nume. Exemplu:
gcc file.c ‐o outexe
Simpla compilare pentru obtinerea unui fisier obiect (fara linkare) dintr-o sursa C, se poate realiza adaugand optiunea -c :
gcc ‐c file.c
Rezultatul va fi un fisier obiect numit file.o . Acesta poate trece prin procesul de linking ulterior pasandu-l ca argument unui alt apel gcc.
In mod implicit, pentru a include headerele specificate in sursele compilate, gcc va cauta in directorul curent si in directoarele ce contin
headerele librariilor standard. Daca este necesara includerea de fisiere header din alta sursa se va folosi optiunea -I urmata de calearespectiva:
gcc ‐I ./custom/include file.c ‐o outexe
Pentru linkarea unei librarii (biblioteca), in vederea obtinerii executabilului final se va folosi optiunea -l urmata imediat de partea din
numele librariei aflata dupa prefixul lib si inainte de sufixul (extensia) .a (acest format de nume este cel intalnit in mod normal pentru
biblioteci). Spre exemplu libraria de functii matematice standard se numeste libm.a . Pentru a linka aceasta librarie se va folosi un apel gc
de genul:
gcc ‐lm file.c ‐o outexe
Daca libraria nu se gaseste in locatiile standard pentru librarii, pentru a fi gasita de linker, este necesara specificarea explicita a locatiei
8/19/2019 Retele de Calculatoare - Lab1
4/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 4
(inclusiv cazul directorului curent), folosind optiunea -L, intr-un mod similar utilizarii optiunii -I pentru locatii de headere
3. Rutine de sistem pentru manipularea fisierelor
Un descriptor de fisier este un simplu intreg utilizat ca index intr-o tabela de fisiere deschise de un proces.
Reamintim descriptorii standard:
0 asociat stdin - intrarea standard
1 asociat stdout - iesirea standard
2 asociat stderr - streamul de eroare standard
Rutinele I/O cele mai utilizate pentru accesul si manipularea fisierelor prin intermediul descriptorilor sunt:
open()
- deschiderea unui fisier
Headerele necesare si prototipurile functiei:
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname - calea catre fisier
flags - optiuni de deschidere a fisierului (ex: O_RDWR - acces citire si scriere)
mode - specificarea explicita a permisiunilor asupra fisierului in cazul crearii acestuia (ex: S_IRWXU - utilizatorul owner are drepturi d
citire, scriere si executie)
Functia returneaza descriptorul asociat fisierului in caz de succes si -1 in caz de eroare
close()
- inchiderea unui fisierHeaderele necesare si prototipurile functiei:
#include
int close(int fd);
fd - descriptorul asociat fisierului (cel returnat la deschidere)
Functia returneaza 0 in caz de succes si -1 in caz de eroare
read()
- citirea dintr-un fisier
Headerele necesare si prototipurile functiei:
#include
ssize_t read(int fd, void *buf, size_t count);
fd - descriptorul asociat fisierului (cel returnat la deschidere)
buf - pointer la bufferul destinatie ce va retine datele citite
count - numarul de bytes specificat pentru a fi citit
Functia returneaza numarul de bytes cititi cu succes in caz de reusita si -1 in caz de eroare
8/19/2019 Retele de Calculatoare - Lab1
5/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 5
write()
- scrierea intr-un fisier
Headerele necesare si prototipurile functiei:
#include
ssize_t write(int fd, void *buf, size_t count);
fd - descriptorul asociat fisierului (cel returnat la deschidere)
buf - pointer la bufferul sursa ce contine datele ce vor fi scrise in fisier
count - numarul de bytes specificat pentru a fi scris
Functia returneaza numarul de bytes scrisi cu succes in caz de reusita si -1 in caz de eroare
fcntl()
- File control - executia a diverse comenzi asupra fisierului
Headerele necesare si prototipurile functiei:
#include
#include
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
fd - descriptorul asociat fisierului (cel returnat la deschidere)
cmd - constanta ce defineste comanda de executat (ex: F_GETFL - obtinerea flagurilor de stare a fisierului)
arg - argument specific in functie de comanda
lock - structura specifica utilizata in cazul comenzilor legate de lock (ex: pt blocaj la scriere/citire)
Valoarea de retur a functiei depinde de comanda
lseek()
- setarea pozitiei curente in cadrul fisierului
Headerele necesare si prototipurile functiei:
#include
#include
off_t lseek(int fildes, off_t offset, int whence);
fildes - descriptorul asociat fisierului (cel returnat la deschidere)
offset - noua pozitie specificata in bytes fata de referinta (negativ - inainte, pozitiv - dupa)
whence - referinta: SEEK_SET inceputul fisierului, SEEK_CUR pozitia curenta in fisier, SEEK_END sfarsitul fisierului
Functia returneaza offsetul in bytes fata de inceputul fisierului in caz de reusita si -1 in caz de eroare
Alte rutine:
ioctl() - manipularea fisierelor speciale asociate diverselor device-uri (ex: terminalul, placa de sunet, etc)
fsync() - rol de flush, scrie pe disc sau pe alt suport datele din memorie asociate unui fisier
ftruncate() - imparte (sectioneaza) un fisier la o anumita lungime
fstat() - returneaza informatii despre un fisier intr-o structura specializata (stat)
fchown() - modifica owner-ul sau grupul asociat cu un fisier deschis
fchmod() - modifica permisiunile de acces la fisier
fchdir() - schimba calea, directorul curent
8/19/2019 Retele de Calculatoare - Lab1
6/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 6
flock() - seteaza lock-uri (blocaje) pe fisiere (regim advisory - uz cooperant - fisierul poate fi accesat din alt proces daca acesta nu face
de asemeni uz de rutina pentru a verifica blocajele)
4. Manipularea fisierelor prin functii de librarie
In afara de utilizarea rutinelor de sistem ce permit accesul la fisiere prin intermediul descriptorilor, acestea pot fi manipulate de asemeni
prin intermediul pointerului FILE * si a functiilor oferite de libraria stdio, ce permit optiuni mai avansate in anumite cazuri cum ar fi spre
exemplu scrierea si citirea din fisier din perspectiva formatarii datelor.
Asemeni descriptorilor de fisier, la pornirea unui program ce utilizeaza libraria stdio, la fiecare din cele trei streamuri standard deschise,
exista cate un pointer de tip FILE * cu numele stdin, stdout si stderr
Principalele operatii cu fisiere utilizand libraria stdio sunt:
Deschiderea si inchiderea fisierelor
FILE *fopen(const char *path, const char *mode);
Deschide un fisier.
Parametri: path - calea catre fisier, mode - mod deschidere (ex: "r+" - read si write)
Retur: pointer la fisierul deschis si NULL in caz de eroare
int fclose(FILE * stream);
Inchide un fisier.
Parametri: stream - pointer la un fisierur ce va fi inchis
Retur: 0 in caz de succes, -1 (EOF - End Of File) in caz de eroare
Citirea si scrierea in fisier
Varianta neformatata
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr - pointer la un buffer destinatie pentru datele citite, respectiv sursa pentru cele scrise
size - dimensiunea unui bloc (record) de citit/scris in bytes
nmemb - numarul de blocuri (records) de citit/scris
stream - pointer la fisierul din care se citeste/in care se scrie
Retur: numarul de blocuri (records) citite/scrise cu succes
Varianta formatata
Familii de functii bazate pe utilizarea de specificatori de format pentru formatarea datelor (ex.: "%d" - intreg, etc)
Signatura tipica: functie (destinatie/sursa, specificator de format, date scrise/citite);
Scriere
int printf(const char *format, ...); ‐ scrie implicit la stdout
int fprintf(FILE *stream, const char *format, ...); ‐ scrie in fisierul specificat de stream
int sprintf(char *str, const char *format, ...); ‐ scrie intr‐un buffer de caractere specificat de str
Citire (similar cu cele de la scriere)
int scanf( const char *format, ...);
int fscanf( FILE *stream, const char *format, ...);
8/19/2019 Retele de Calculatoare - Lab1
7/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 7
int sscanf( const char *str, const char *format, ...);
Returneaza numarul de caractere scrise/citite fara terminatorul de sir adaugat implicit ('\0') si o valoare negativa in caz de eroare
Varianta bazata pe functii cu efect la nivel de caracter si linie
Este vorba de familiile de functii utilizate pentru a scrie/citi cate un caracter sau o linie din fisier la un singur apel
int fgetc(FILE *stream); ‐ citeste un caracter din stream
char *fgets(char *s, int size, FILE *stream); ‐ citeste size‐1 caractere din stream pana la maxim sfarsitul liniei curen
int getc(FILE *stream); ‐ la fel ca fgetc
int getchar(void); ‐ citeste un caracter de la stdin implicit
char *gets(char *s); ‐ citeste o linie de la stdin implicit
int fputc(int c, FILE *stream); ‐ scrie un caracter in stream
int fputs(const char *s, FILE *stream); ‐ scrie o linie in stream
int putc(int c, FILE *stream); ‐ la fel ca fputc
int putchar(int c); ‐ scrie un caracter la stdout implicit
int puts(const char *s); ‐ scrie o linie la stdout implicit
Functii pentru obtinerea starii fisierului
int feof( FILE *stream);
int ferror( FILE *stream);
void clearerr( FILE *stream);
feof - in cazul incercarii de citire dupa ce se ajunge la finalul fisierului va fi setat un flag intern de End Of File iar valoarea returnata de
aceasta functie va fi diferita de 0
ferror - returneaza o valoare nenula daca un flag intern de eroare al fisierului este setat (de exemplu daca incercam sa scriem intr-un
fisier deschis doar cu drepturi de citire)
clearerr - reseteaza flagurile de EOF si de eroare
Functii de pozitionare in fisier
int fseek( FILE *stream, long offset, int whence);
long ftell( FILE *stream);
void rewind( FILE *stream);
fseek - seteaza pozitia in fisier fata de referinta; argumentele sunt similare lseek
ftell - returneaza pozitia curenta in fisier
rewind - seteaza pozitia in fisier la 0
In general, in cazul esecului unei functii din cele mentionate, codul de eroare va fi retinut in variabila globala errno. Pentru detalii asupra
diverselor coduri de eroare consultati intrarea din manual corespunzatoare functiei (in general man 2 functie sau man 3 functie)
5. Lucrul cu directoare
Operatiile legate de accesul la directoare sunt facilitate prin structurile de date si functiile puse la dispozitie de headerul dirent.h
Structurile de date necesare pentru operatiile cu directoare sunt:
DIR - reprezinta, s-ar putea spune, intrarea efectiva pe disc de tip director, in sensul unui stream - fisier - ce contine o serie de intrari
(subdirectoare si alte fisiere)
struct dirent - reprezinta o structura de informatii asociata unei structuri DIR ce contine diverse informatii relativ la o intrare din
respectivul director cum ar fi numele in campul d_name de tip vector de char sau tipul intrarii (fisier sau director) in campul d_type
Functiile disponibile pentru lucrul cu directoare sunt urmatoarele:
8/19/2019 Retele de Calculatoare - Lab1
8/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 8
opendir()
- "deschiderea" unui director
DIR* opendir(const char* dirname)
dirname - pointer la calea respectivului director
retur - un pointer la o structura DIR, corespunzand primei intrari din respectivul director in caz de succes si null in caz de eroare
readdir()
- citirea informatiilor despre o intrare din director
struct dirent* readdir(DIR* dirp)
dirp - pointer la o intrare din cadrul directorului
retur - un pointer la o structura dirent corespunzatoare intrarii indicate de pointerul DIR, urmata de avansarea la urmatoarea intrare
din acelasi director sau null in caz ca nu mai exista alta intrare si de asemeni in caz de eroare (cu diferenta ca in acest ultim caz este
setata si variabila errno)
rewinddir()
- repozitionarea la prima intrare din cadrul directorului
void rewinddir(DIR* dirp)
dirp - pointer la o intrare oarecare din cadrul directorului in care se realizeaza repozitionarea
telldir()
- obtinerea indexului unei intrari din cadrul directorului
off_t telldir(DIR* dirp)
dirp - pointer la o intrare din cadrul directorului
retur - un intreg ce reprezinta pozitia curenta a intrarii in cadrul directorului si -1 in caz de eroare
seekdir()
- pozitionarea la o anumita intrare in cadrul directorului
void seekdir(DIR *dir, off_t offset)
dir - pointer la intrarea curenta in cadrul directorului
offset - noua pozitie care va indica intrarea curenta
closedir()
- "inchiderea" directorului
int closedir(DIR* dirp)
dirp - pointer la o intrare in cadrul directorului
retur - 0 daca inchiderea s-a efectuat cu succes, insemnand ca pointerul dirp nu va mai fi valid pentru respectivul director, sau -1 in
caz de esec
8/19/2019 Retele de Calculatoare - Lab1
9/10
28.03.2016 Retele de calculatoare
fi le:///C:/M y%20W eb%20Si tes/Retel e%20Cal culatoar e/pr ofs.i nfo.uai c.r o/_eoni ca/r c/l ab01.htm l 9
6. Managementul memoriei - quick reminder
In aceasta sectiune reamintim principalele functii de management a memoriei din limbajul C. Acestea cer includerea in program a
stdlib.h:
malloc()
- alocarea neinitializata a unui bloc de memorie
void *malloc(size_t size);
size - numarul de octeti de alocat
retur - pointer la locatia de memorie alocata, NULL in caz de eroare
calloc()
- alocarea initializata cu 0 a unui bloc de memorie
void *calloc(size_t nmemb, size_t size);
nmemb - numarul de blocuri de alocat
size - dimensiunea in octeti de alocat
retur - pointer la locatia de memorie alocata, NULL in caz de eroare
realloc()
- redimensionarea unui bloc de memorie anterior alocat (fara initializare pentru dimensiunea adaugata)
void *realloc(void *ptr, size_t size);
ptr - pointer la un bloc de memorie alocat anterior; daca e NULL comportarea e similara malloc
size - noua dimensiune; daca e 0 memoria e eliberata (similar free)
retur - pointer la locatia de memorie alocata, NULL in caz de eroare
free()
- eliberarea unui bloc de memorie
void free(void *ptr);
ptr - pointer la o locatie de memorie alocata cu una din functiile anterioare
7. Exercitii
7.1. Bash
1. Ce efect are urmatoarea linie de comenzi: echo ` who | cut -c1-9 | sort | uniq ` >> users ? (hint: folositi man pentru a afla efectulcomenzilor) Cum puteti pastra rezultatele partiale dintre fiecare din comenzile inlatuite prin pipe in fisiere separate pentru consultare
ulterioara a stadiului de executie intermediar, fara a separa linia de comenzi in mai multe ? Realizati aceasta modificare. (hint: man tee)
2. Folosind stat,grep,cut afisati inodul unui fisier. Se poate si mai simplu ? (hint: doar cu una din comenzi)
3. Sa se afiseze toti utilizatorii care au numele conturilor terminate in "x".
7.2.Lucrul cu fisiere
1. Fiind dat urmatorul fisier - testpak- scrieti un program care sa citeasca din acesta un "pachet" cu urmatoarea structura (utilizand
primitive de sistem) si afisati continutul "campurilor" acestuia :
8/19/2019 Retele de Calculatoare - Lab1
10/10
28.03.2016 Retele de calculatoare
fi l ///C /M %20W b%20Si t /R t l %20C l l t / f i f i / i / /l b01 ht l 10
port sursa - intreg 0-65535
port destinatie - intreg 0-65535
lungime - intreg 0-65535
checksum - intreg 0-65535
date - sir de caractere de dimensiune 32
2. Implementati un program care simuleaza find in mod recursiv.
3. Sa se scrie un program care primeste ca argument un nume de fisier sau director la intrare, iar la iesire returneaza tipul intrarii de pe
disc (fisier sau director) si momentul ultimei modificari. (hint: fstat)