Retele de Calculatoare - Lab1

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)