This shows you the differences between two versions of the page.
so:laboratoare:laborator-02 [2019/02/24 17:17] bogdan.purcareata [Linux (5p)] |
so:laboratoare:laborator-02 [2020/02/21 15:38] (current) liza_elena.babu [Scrierea și citirea] |
||
---|---|---|---|
Line 139: | Line 139: | ||
</code> | </code> | ||
- | Funcția [[http://linux.die.net/man/2/read|read]] întoarce numărul de octeți efectiv citiți, cel mult ''count''. Valoarea minimă este de ''1'' octet, iar când se ajunge la sfârșitul de fișier se va întoarce ''0''. | + | Funcția [[http://linux.die.net/man/2/read|read]] întoarce numărul de octeți efectiv citiți, **cel mult** ''count''. Valoarea minimă este de ''1'' octet, iar când se ajunge la sfârșitul de fișier se va întoarce ''0''. |
=== write === | === write === | ||
Line 149: | Line 149: | ||
</code> | </code> | ||
- | Valoarea întoarsă este numărul de octeți ce au fost efectiv scriși, cel mult ''count''. În mod implicit nu se garantează că la revenirea din [[http://linux.die.net/man/2/write|write]] scrierea în fișier s-a terminat. Pentru a forța actualizarea se poate folosi [[http://linux.die.net/man/2/fsync|fsync]] sau fișierul se poate deschide folosind flagul ''O_FSYNC'', caz în care se garantează că după fiecare write fișierul a fost actualizat. | + | Valoarea întoarsă este numărul de octeți ce au fost efectiv scriși, **cel mult** ''count''. În mod implicit nu se garantează că la revenirea din [[http://linux.die.net/man/2/write|write]] scrierea în fișier s-a terminat. Pentru a forța actualizarea se poate folosi [[http://linux.die.net/man/2/fsync|fsync]] sau fișierul se poate deschide folosind flagul ''O_FSYNC'', caz în care se garantează că după fiecare write fișierul a fost actualizat. |
**Observație 1**: | **Observație 1**: | ||
Line 254: | Line 254: | ||
</code> | </code> | ||
* dup | * dup | ||
- | * creaza o copie a unui file descriptor/ | + | * crează o copie a unui file descriptor. |
- | * utilizeaza cel mai mic numar de descriptor neutilizat. | + | * utilizează cel mai mic număr de descriptor neutilizat. |
- | * daca apelul reuseste, vechiul si noul file descriptor pot fi folositi, ei partajand file offset si file status flags. | + | * dacă apelul reușește, vechiul și noul file descriptor pot fi folosiți, ei partajând file offset și file status flags. |
* dup2 | * dup2 | ||
- | * asemanator dup, dar in loc sa se aleaga cel mai mic descriptor, acesta utilizeaza new_fd specificat. | + | * asemănător dup, dar în loc să se aleagă cel mai mic descriptor, acesta utilizează new_fd specificat. |
- | * daca new_fd este deja fosit, acesta este mai intai inchis inainte de a fi reutilizat. | + | * dacă new_fd este deja folosit, acesta este mai întâi închis înainte de a fi reutilizat. |
- | * daca old_fd nu este valid, apelul esueaza iar new_fd nu este inchis. | + | * dacă old_fd nu este valid, apelul eșueaza iar new_fd nu este închis. |
Line 269: | Line 269: | ||
</code> | </code> | ||
- | Imaginea de mai jos prezinta utilizarea dup si dup2 in diferite situatii pentru o intelegere mai buna: | + | Imaginea de mai jos prezintă utilizarea dup și dup2 în diferite situații pentru o înțelegere mai bună: |
Line 686: | Line 686: | ||
[[https://www.facebook.com/groups/240794072931431/|facebook page]] | [[https://www.facebook.com/groups/240794072931431/|facebook page]] | ||
- | ==== Exercițiul 0 - Joc interactiv ==== | ||
- | |||
- | * Detalii desfășurare [[http://ocw.cs.pub.ro/courses/so/meta/notare#joc_interactiv|joc]]. | ||
===== Linux ===== | ===== Linux ===== | ||
- | ==== Exercițiul 1 - redirect (1p) ==== | + | ==== Exercițiul 1 - redirect ==== |
Intrați în directorul ''1-redirect'' și urmăriți conținutul fișierului ''redirect.c''. | Intrați în directorul ''1-redirect'' și urmăriți conținutul fișierului ''redirect.c''. | ||
Line 708: | Line 705: | ||
* revedeți secțiunea de [[#redirectari|redirectări]] | * revedeți secțiunea de [[#redirectari|redirectări]] | ||
- | ==== Exercițiul 2 - lseek (1p) ==== | + | ==== Exercițiul 2 - lseek ==== |
Intrați în directorul ''2-lseek'' și urmăriți codul sursă din ''lseek.c''. | Intrați în directorul ''2-lseek'' și urmăriți codul sursă din ''lseek.c''. | ||
Line 715: | Line 712: | ||
Sursa închide doar file descriptorul ''fd1''. Este nevoie să se închidă și file descriptorul ''fd2''? De ce? | Sursa închide doar file descriptorul ''fd1''. Este nevoie să se închidă și file descriptorul ''fd2''? De ce? | ||
- | ==== Exercițiul 3 - mcat (3p) ==== | + | ==== Exercițiul 3 - mcat ==== |
Intrați în directorul ''3-mcat''. | Intrați în directorul ''3-mcat''. | ||
- | === 3a. Similitudine cat (1p) === | + | === 3a. Similitudine cat === |
Completați fișierul astfel încât programul rezultat ''mcat'' să aibă funcționalitate similară cu a utilitarului ''cat'' (urmăriți comentariile cu ''TODO 1'') | Completați fișierul astfel încât programul rezultat ''mcat'' să aibă funcționalitate similară cu a utilitarului ''cat'' (urmăriți comentariile cu ''TODO 1'') | ||
Line 731: | Line 728: | ||
Testați cu o comandă de genul: <code bash>./mcat Makefile </code> | Testați cu o comandă de genul: <code bash>./mcat Makefile </code> | ||
- | === 3b. Similitudine cp (1p) === | + | === 3b. Similitudine cp === |
Extindeți funcționalitatea astfel încât output-ul să fie redirectat într-un fișier primit ca al doilea argument - funcționalitate similară cu a utilitarului ''cp''. (urmăriți comentariile cu ''TODO 2'') | Extindeți funcționalitatea astfel încât output-ul să fie redirectat într-un fișier primit ca al doilea argument - funcționalitate similară cu a utilitarului ''cp''. (urmăriți comentariile cu ''TODO 2'') | ||
Line 739: | Line 736: | ||
Testați funcționalitatea: <code bash>./mcat Makefile out ; ./mcat out </code> | Testați funcționalitatea: <code bash>./mcat Makefile out ; ./mcat out </code> | ||
- | === 3c. /dev/nasty (1p) === | + | === 3c. /dev/nasty === |
- | Inițializați fișierul ''/dev/nasty'':<code bash>./set_nasty.sh</code> | + | Inițializați fișierul ''/dev/nasty'': |
+ | <code bash> | ||
+ | sudo apt-get install linux-modules-$(uname -r) linux-headers-$(uname -r) | ||
+ | ./set_nasty.sh | ||
+ | </code> | ||
Încercați funcționalitatea de copiere pe fișierul ''/dev/nasty'': <code bash>./mcat /dev/nasty | Încercați funcționalitatea de copiere pe fișierul ''/dev/nasty'': <code bash>./mcat /dev/nasty | ||
Line 750: | Line 751: | ||
Testați **scrierea** cu: <code bash>./mcat Makefile /dev/nasty ; cat /dev/nasty</code> | Testați **scrierea** cu: <code bash>./mcat Makefile /dev/nasty ; cat /dev/nasty</code> | ||
<note tip> | <note tip> | ||
- | În cazul în care ultima comandă nu produce rezultatul așteptat, cel mai probabil nu ați tratat corect cazurile în care ''read''/''write'' întorc o valoare mai mică decât al treilea parametru. | + | În cazul în care ultima comandă nu produce rezultatul așteptat, cel mai probabil nu ați tratat corect cazurile în care ''read''/''write'' întorc o valoare mai mică decât al treilea parametru - i.e. nu s-a citit/scris tot. |
**Hint: ** Pentru a garanta scrierea/citirea numarului exact de bytes care este dat ca parametru, se recomanda apelarea read/write **in bucla.** | **Hint: ** Pentru a garanta scrierea/citirea numarului exact de bytes care este dat ca parametru, se recomanda apelarea read/write **in bucla.** | ||
Line 756: | Line 757: | ||
</note> | </note> | ||
- | ===== Windows (4p) ===== | + | ===== Windows ===== |
<note important>Executabilele sunt generate în directorul ''win/Debug'' (în directorul ''Debug'' al soluției, nu al fiecărui proiect în parte).</note> | <note important>Executabilele sunt generate în directorul ''win/Debug'' (în directorul ''Debug'' al soluției, nu al fiecărui proiect în parte).</note> | ||
- | ==== Exercițiul 1 - cat (0.5p) ==== | + | ==== Exercițiul 1 - cat ==== |
Deschideți folderul ''win'' din arhiva laboratorului 2 și intrați în proiectul ''1-cat'', iar apoi urmăriți sursa ''cat.c'' | Deschideți folderul ''win'' din arhiva laboratorului 2 și intrați în proiectul ''1-cat'', iar apoi urmăriți sursa ''cat.c'' | ||
Line 766: | Line 767: | ||
Compilați și testați executabilul ''cat.exe'' folosind command prompt-ul de Visual Studio: Tools -> Visual Studio Command Prompt | Compilați și testați executabilul ''cat.exe'' folosind command prompt-ul de Visual Studio: Tools -> Visual Studio Command Prompt | ||
- | ==== Exercițiul 2 - CRC (3.5p) ==== | + | ==== Exercițiul 2 - CRC ==== |
Exercițiul are ca scop realizarea unui utilitar care: | Exercițiul are ca scop realizarea unui utilitar care: | ||
Line 772: | Line 773: | ||
* Pentru două fișiere date (în acest caz, de CRC), le compară și determină dacă sunt identice. | * Pentru două fișiere date (în acest caz, de CRC), le compară și determină dacă sunt identice. | ||
- | === 2a. Generare (1.5p) === | + | === 2a. Generare === |
Deschideți fișierul ''crc.c'' din proiectul ''2-crc'' și completați funcția ''GenerateCrc''. | Deschideți fișierul ''crc.c'' din proiectul ''2-crc'' și completați funcția ''GenerateCrc''. | ||
Line 782: | Line 783: | ||
Urmăriți comentariile cu ''TODO 1''. | Urmăriți comentariile cu ''TODO 1''. | ||
- | === 2b. Comparare (2p) === | + | === 2b. Comparare === |
Odată calculat fișierul cu CRC, vrem să vedem dacă două fișiere de CRC sunt egale. Extindeți funcționalitatea programului anterior astfel încât să compare 2 fișiere. Vom lucra în funcția ''CompareFiles''. | Odată calculat fișierul cu CRC, vrem să vedem dacă două fișiere de CRC sunt egale. Extindeți funcționalitatea programului anterior astfel încât să compare 2 fișiere. Vom lucra în funcția ''CompareFiles''. | ||
Line 794: | Line 795: | ||
==== BONUS - Linux ==== | ==== BONUS - Linux ==== | ||
- | == 1 so karma - Troubleshooting == | + | == Troubleshooting == |
Intrați în directorul ''4-trouble''. Compilați și rulați programul ''trouble''. | Intrați în directorul ''4-trouble''. Compilați și rulați programul ''trouble''. | ||
Line 802: | Line 803: | ||
Ce observați? Identificați și remediați problema. Revedeți secțiunea: [[#crearea deschiderea si inchiderea fisierelor|Crearea, deschiderea și închiderea fișierelor]]. | Ce observați? Identificați și remediați problema. Revedeți secțiunea: [[#crearea deschiderea si inchiderea fisierelor|Crearea, deschiderea și închiderea fișierelor]]. | ||
- | == 1 so karma - File lock == | + | == File lock == |
Vrem să ne asigurăm că doar **o instanță** a unui program rulează la un moment dat. Pentru asta se creează un fișier temporar pe care se încearcă obținerea unui lock folosind apelul [[http://linux.die.net/man/2/flock | flock]]. | Vrem să ne asigurăm că doar **o instanță** a unui program rulează la un moment dat. Pentru asta se creează un fișier temporar pe care se încearcă obținerea unui lock folosind apelul [[http://linux.die.net/man/2/flock | flock]]. | ||
Line 816: | Line 817: | ||
Utilitar echivalent cu ''ls -a -R''. | Utilitar echivalent cu ''ls -a -R''. | ||
- | == 1 so karma - Creare utilitar ls == | + | == Creare utilitar ls == |
Deschideți din arhiva laboratorului 2 proiectul ''3-ls''. Completați fișierul ''ls.c'' pentru ca programul ''3-ls.exe'' să se comporte ca utilitarul ''ls''. | Deschideți din arhiva laboratorului 2 proiectul ''3-ls''. Completați fișierul ''ls.c'' pentru ca programul ''3-ls.exe'' să se comporte ca utilitarul ''ls''. | ||
Line 827: | Line 828: | ||
Pentru testare folosiți dintr-un prompt Visual Studio: <code bash>ls.exe ..</code> | Pentru testare folosiți dintr-un prompt Visual Studio: <code bash>ls.exe ..</code> | ||
- | == 1 so karma - Afișare detalii pentru parametrul -a == | + | == Afișare detalii pentru parametrul -a == |
Pentru fișiere afișați numele, dimensiunea și data la care au fost modificate ultima oară. | Pentru fișiere afișați numele, dimensiunea și data la care au fost modificate ultima oară. | ||
Line 835: | Line 836: | ||
* Urmăriți comentariile marcate cu ''TODO 2'' | * Urmăriți comentariile marcate cu ''TODO 2'' | ||
- | == 1 so karma - Afișare detalii pentru parametrul -R == | + | == Afișare detalii pentru parametrul -R == |
Realizați parcurgerea recursivă a directoarelor prin apelarea recursivă a funcției ''ListFile''. | Realizați parcurgerea recursivă a directoarelor prin apelarea recursivă a funcției ''ListFile''. | ||
Line 841: | Line 842: | ||
Pentru rezolvare, urmăriți comentariile marcate cu ''TODO 3''. Aveți grijă să concatenați numele noului director la calea deja existentă. | Pentru rezolvare, urmăriți comentariile marcate cu ''TODO 3''. Aveți grijă să concatenați numele noului director la calea deja existentă. | ||
- | == 1 so karma - Troubleshooting == | + | == Troubleshooting == |
Deschideți din arhiva laboratorului 2 proiectul ''4-trouble''. Programul ar trebui să creeze un fișier cu mesajul "Testing 123". | Deschideți din arhiva laboratorului 2 proiectul ''4-trouble''. Programul ar trebui să creeze un fișier cu mesajul "Testing 123". | ||
Line 856: | Line 857: | ||
[[http://elf.cs.pub.ro/so/res/laboratoare/lab02-sol.zip | lab02-sol.zip]] | [[http://elf.cs.pub.ro/so/res/laboratoare/lab02-sol.zip | lab02-sol.zip]] | ||
+ | |||
+ | |||
===== Resurse utile ===== | ===== Resurse utile ===== |