This shows you the differences between two versions of the page.
so:teme-new:tema-2 [2019/03/12 21:57] adrian.sendroiu [Precizări Linux] |
so:teme-new:tema-2 [2019/03/14 10:57] (current) razvan.crainea [Testare] |
||
---|---|---|---|
Line 2: | Line 2: | ||
<note important> | <note important> | ||
- | Dată publicare: **15 Martie 2018** | + | * Dată publicare: **14.03.2019** |
+ | * <html><b><span style="color:blue;">Deadline</span></b></html>: **03.04.2019, ora 23:55** | ||
+ | * <html><b><span style="color:red;">Deadline hard</span></b></html>: **10.04.2019, ora 23:55** | ||
+ | </note> | ||
- | Deadline: <html><span style="font-weight: bold;color:red;">4 Aprilie 2018, ora 23:55</span></html> | + | ===== Obiectivele temei ===== |
- | Deadline hard: <html><span style="font-weight: bold;color:red;">11 Aprilie 2018, ora 23:55</span></html> | + | * Familiarizarea cu modul de funcționare al bibliotecii standard input/output (stdio) |
+ | * Aprofundarea conceptelor de: | ||
+ | * I/O buffering | ||
+ | * Crearea de procese și rularea de fișiere executabile | ||
+ | * Redirectearea intrărilor și ieșirilor standard | ||
+ | * Generarea de biblioteci dinamice | ||
+ | ===== Dezvoltarea temei ===== | ||
+ | |||
+ | Dezvoltarea trebuie făcută exclusiv pe [[so:info:mv|mașinile virtuale]] SO. | ||
+ | |||
+ | <note important> | ||
+ | Nu rulați testele //"local"// (pe calculatoarele voastre sau în mașinile voastre virtuale). Veți avea diferențe față de vmchecker, iar echipa de SO nu va depana testele care merg "local", dar pe vmchecker nu merg. Pe vmchecker sunt aceleași [[so:info:mv|mașinile virtuale]] ca cele de pe wiki. | ||
</note> | </note> | ||
- | ===== Obiectivele temei ===== | + | <note tip> |
+ | Este încurajat ca lucrul la tema să se desfășoare folosind ''git''. Indicați în README link-ul către repository dacă ați folosit git. | ||
+ | **Asigurați-vă că responsabilii de teme au drepturi de citire asupra repo-ului vostru**. | ||
+ | |||
+ | Ca să vă creați un repo de gitlab în instanța facultății: în repository-ul [[https://github.com/systems-cs-pub-ro/so-assignments|so-assignments]] de pe Github se află un script Bash care vă ajută să vă creați un repository privat pe instanța de Gitlab a facultății, unde aveți la dispoziție 5 repository-uri private utile pentru teme. Urmăriți indicațiile din README și de pe [[:so:teme:folosire-gitlab|wiki-ul SO]]. | ||
+ | |||
+ | Motivul pentru care încurajăm acest lucru este că responsabilii de teme se pot uita mai rapid pe [[https://gitlab.cs.pub.ro|Gitlab]] la temele voastre pentru a vă ajuta în cazul în care întâmpinați probleme/bug-uri. Este mai ușor să primiți suport în rezolvarea problemelor implementării voastre dacă le oferiți responsabililor de teme acces la codul sursă pe [[https://gitlab.cs.pub.ro|Gitlab]]. | ||
+ | |||
+ | Crash-course practic de git puteți găsi aici: [[http://gitimmersion.com/lab_01.html#main_content|git-immersion]] | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Atât semnătura pentru funcția de comparare (veți vedea mai jos pentru ce vă trebuie), cât și testele publice care se rulează pe vmchecker se găsesc pe [[https://github.com/systems-cs-pub-ro/so-assignments/tree/master/2-stdio/|repo-ul so-assignments de pe Github]]: | ||
+ | |||
+ | <code bash> | ||
+ | student@so:~$ git clone https://github.com/systems-cs-pub-ro/so-assignments.git | ||
+ | student@so:~$ cd so-assignments/2-stdio | ||
+ | </code> | ||
+ | |||
+ | |||
+ | În repository-ul de pe Github se vor găsi și scheletele pentru temele viitoare, care vor fi actualizate și se vor putea descărca pe viitor folosind comanda: | ||
+ | |||
+ | <code bash> | ||
+ | student@so:~$ git pull | ||
+ | </code> | ||
+ | |||
+ | Tot prin comanda de mai sus se pot obține toate actualizările făcute în cadrul temei 2. | ||
+ | </note> | ||
- | * TODO | ||
===== Enunț ===== | ===== Enunț ===== | ||
- | Să se realizeze o implementare minimală a bibliotecii stdio, care să permită lucrul cu fișiere. Biblioteca va trebui să implementeze structura SO_FILE (similar cu FILE din biblioteca standard C), împreună cu funcțiile de citire/scriere. De asemenea, va trebui să implementați funcționalitatea de buffering. | + | Să se realizeze o implementare minimală a bibliotecii stdio, care să permită lucrul cu fișiere. Biblioteca va trebui să implementeze structura SO_FILE (similar cu FILE din biblioteca standard C), împreună cu funcțiile de citire/scriere. De asemenea, va trebui să ofere funcționalitatea de buffering. |
+ | Rezolvarea temei va trebui să genereze o bibliotecă dinamică numită ''libso_stdio.so''/''so_stdio.dll'' care implementează header-ul | ||
+ | [[https://github.com/systems-cs-pub-ro/so-assignments/blob/master/2-stdio/util/so_stdio.h|so_stdio.h]]. În acest header găsiți semnăturile functiilor exportate de biblioteca generată de voi. | ||
===== SO_FILE ===== | ===== SO_FILE ===== | ||
Line 149: | Line 191: | ||
===== Precizări/recomandări pentru implementare ===== | ===== Precizări/recomandări pentru implementare ===== | ||
+ | * Dimensiunea bufferului unui fișier este dată de macro-ul ''DEFAULT_BUF_SIZE''. | ||
* Pentru simplitate, sugerăm să începeți implementarea cu ''so_fgetc''/''so_fputc''. Apoi ''so_fread''/''so_fwrite'' pot fi implementate pe baza lor. | * Pentru simplitate, sugerăm să începeți implementarea cu ''so_fgetc''/''so_fputc''. Apoi ''so_fread''/''so_fwrite'' pot fi implementate pe baza lor. | ||
* Pentru fișierele deschise în unul din modurile "r", "r+", "w", "w+", cursorul va fi poziționat inițial la începutul fișierului. | * Pentru fișierele deschise în unul din modurile "r", "r+", "w", "w+", cursorul va fi poziționat inițial la începutul fișierului. | ||
Line 154: | Line 197: | ||
* Pentru fișierele deschise în modul "a+", scrierile se fac la fel ca mai sus. În schimb, citirea se face inițial de la începutul fișierului. | * Pentru fișierele deschise în modul "a+", scrierile se fac la fel ca mai sus. În schimb, citirea se face inițial de la începutul fișierului. | ||
* Conform standardului C, pentru fișierele deschise în modul update (i.e. toate modurile care conțin caracterul '+' la final: "r+", "w+", "a+") trebuie respectate următoarele (de asemenea vor fi respectate în teste): | * Conform standardului C, pentru fișierele deschise în modul update (i.e. toate modurile care conțin caracterul '+' la final: "r+", "w+", "a+") trebuie respectate următoarele (de asemenea vor fi respectate în teste): | ||
- | * Între o operație de citire și o operație de scriere trebuie intercalată o operație de ''fseek''. | + | * Între o operație de citire urmată de o operație de scriere trebuie intercalată o operație de ''fseek''. |
- | * Între o operație de scriere și o operație de citire trebuie intercalată o operație de ''fflush'' sau ''fseek''. | + | * Între o operație de scriere urmată de o operație de citire trebuie intercalată o operație de ''fflush'' sau ''fseek''. |
* La o operație de ''so_fseek'' trebuie avute în vedere următoarele: | * La o operație de ''so_fseek'' trebuie avute în vedere următoarele: | ||
* Dacă ultima operație făcută pe fișier a fost una de citire, tot bufferul trebuie invalidat. | * Dacă ultima operație făcută pe fișier a fost una de citire, tot bufferul trebuie invalidat. | ||
Line 161: | Line 204: | ||
===== Precizări Linux ===== | ===== Precizări Linux ===== | ||
*Tema se va realiza folosind funcții POSIX. Astfel ''so_fopen'' se va implementa folosind ''open'', ''so_fgetc''/''so_fread'' folosind ''read'', ''so_fputc''/''so_write'' folosind ''write'', etc. | *Tema se va realiza folosind funcții POSIX. Astfel ''so_fopen'' se va implementa folosind ''open'', ''so_fgetc''/''so_fread'' folosind ''read'', ''so_fputc''/''so_write'' folosind ''write'', etc. | ||
- | *În implementarea ''popen'', trebuie să închideți capetele de pipe nefolosite atât în procesul părinte cât și în procesul copil. | + | *În implementarea ''popen'' trebuie să închideți capetele de pipe nefolosite atât în procesul părinte cât și în procesul copil. |
+ | * Nu aveți voie să folositți funcția ''system()'' | ||
===== Precizări Windows ===== | ===== Precizări Windows ===== | ||
*Tema se va realiza folosind funcții Win32. Astfel ''so_fopen'' se va implementa folosind ''CreateFile'', ''so_fgetc''/''so_fread'' folosind ''ReadFile'', ''so_fputc''/''so_write'' folosind ''WriteFile'', etc. | *Tema se va realiza folosind funcții Win32. Astfel ''so_fopen'' se va implementa folosind ''CreateFile'', ''so_fgetc''/''so_fread'' folosind ''ReadFile'', ''so_fputc''/''so_write'' folosind ''WriteFile'', etc. | ||
- | *În implementarea ''popen'', înainte de a apela ''CreateProcess'' trebuie să marcați ca nemoștenibil capătul de pipe nefolosit de către procesul copil. În acest sens, puteți folosi funcția ''SetHandleInformation''. | + | *În implementarea ''popen'', înainte de a apela ''CreateProcess'', trebuie să marcați ca nemoștenibil capătul de pipe nefolosit de către procesul copil. În acest scop, puteți folosi funcția ''SetHandleInformation''. |
*Pentru a detecta EOF la citirea dintr-un pipe trebuie ca ''ReadFile'' să întoarcă ''FALSE'', iar ''GetLastError'' să întoarcă ''ERROR_BROKEN_PIPE''. | *Pentru a detecta EOF la citirea dintr-un pipe trebuie ca ''ReadFile'' să întoarcă ''FALSE'', iar ''GetLastError'' să întoarcă ''ERROR_BROKEN_PIPE''. | ||
+ | |||
+ | ===== Testare ===== | ||
+ | |||
+ | *Pentru simplificarea procesului de corectare a temelor, dar și pentru a reduce greșelile temelor trimise, corectarea se va realiza automat cu ajutorul testelor publice indicate în secțiunea de materiale ajutătoare. | ||
+ | *Există 33 teste. Se pot obține maxim 9.5 puncte prin trecerea testelor. Se acordă 0.5 puncte din oficiu. | ||
+ | ***Testul 0** din cadrul checker-ului temei verifică automat coding style-ul surselor voastre folosind [[https://www.kernel.org/doc/Documentation/process/coding-style.rst | stilul de coding din kernelul Linux]]. Acest test valorează **5 puncte** din totalul de 100. Pentru mai multe informații despre un cod de calitate citiți [[so:laboratoare:resurse:c_tips | pagina de recomandări]]. | ||
+ | *Din punctajul temei se vor scădea automat puncte pentru întârzieri și pentru warning-uri. La revizia temei, se poate scădea suplimentar pentru nerespectarea criteriilor scrise la secțiunea de [[so:teme:general#lista_depunctari | depunctări]] ale temelor. | ||
+ | *În cazuri excepționale se poate scădea mai mult decât este menționat mai sus. | ||
+ | |||
+ | <note important> | ||
+ | Înainte de a [[https://vmchecker.cs.pub.ro/ui/ | uploada]] tema, asigurați-vă că implementarea voastră trece testele pe [[so:info:mv | mașinile virtuale]]. Dacă apar probleme în rezultatele testelor, acestea se vor reproduce și pe [[https://vmchecker.cs.pub.ro/ui/ | vmchecker]]. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Pentru a inspecta diferențele între output-ul bibliotecii voastre și fișierele de referință ale checker-ului setați ''DO_CLEANUP=no'' în scriptul [[https://github.com/systems-cs-pub-ro/so-assignments/blob/master/2-stdio/checker/_test/run_test.sh | run_test.sh]]. | ||
+ | </note> | ||
+ | |||
+ | ===== Materiale ajutătoare ===== | ||
+ | Cursuri utile: | ||
+ | *[[so:cursuri:curs-01 | Curs 1]] | ||
+ | *[[so:cursuri:curs-02 | Curs 2]] | ||
+ | *[[so:cursuri:curs-03 | Curs 3]] | ||
+ | |||
+ | Laboratoare utile: | ||
+ | *[[so:laboratoare:laborator-01 | Laborator 1]] | ||
+ | *[[so:laboratoare:laborator-02 | Laborator 2]] | ||
+ | *[[so:laboratoare:laborator-03 | Laborator 3]] | ||
+ | |||
+ | Resurse: | ||
+ | * Header-ul [[https://github.com/systems-cs-pub-ro/so-assignments/blob/master/2-stdio/util/so_stdio.h|so_stdio.h]] expus de biblioteca ''so_stdio''. | ||
+ | |||
+ | Pagina de Upload: | ||
+ | *[[https://elf.cs.pub.ro/vmchecker/ui | vmchecker]] | ||
+ | |||
+ | <note important> | ||
+ | [[https://github.com/systems-cs-pub-ro/so-assignments|Repo-ul de pe Github]] conține și un script Bash care vă ajută să vă creați un repository privat pe instanța de [[https://gitlab.cs.pub.ro|Gitlab]] a facultății, unde aveți la dispoziție 5 repository-uri private utile pentru teme. Urmăriți indicațiile din README și de pe [[:so:teme:folosire-gitlab|wiki-ul SO]]. | ||
+ | |||
+ | În plus, responsabilii de teme se pot uita mai rapid pe [[https://gitlab.cs.pub.ro|Gitlab]] la temele voastre pentru a vă ajuta în cazul în care întâmpinați probleme/bug-uri. Este mai ușor să primiți suport în rezolvarea problemelor implementării voastre dacă le oferiți responsabililor de teme acces la codul sursă pe [[https://gitlab.cs.pub.ro|Gitlab]]. | ||
+ | |||
+ | **Dacă ați folosit [[https://gitlab.cs.pub.ro|Gitlab]] pentru realizarea temei, indicați în README link-ul către repository. Asigurați-vă că responsabilii de teme au drepturi de citire asupra repo-ului vostru**. | ||
+ | |||
+ | </note> | ||
+ | |||
+ | ===== Suport, întrebări și clarificări ===== | ||
+ | |||
+ | Pentru întrebări sau nelămuriri legate de temă folosiți [[:so:info:lista-discutii|lista de discuții]] sau [[:so:info:documentatie#social_media|canalul de IRC]]. | ||
+ | |||
+ | <note important> | ||
+ | Orice intrebare pe mailing list e recomandat să aibă subiectul de forma ''[Tema2][Platforma] Titlul problemei''. Exemple de așa da: | ||
+ | |||
+ | * [Tema2][Linux] Biblioteca nu se generează | ||
+ | * [Tema2][Windows] No makefile found | ||
+ | * [Tema2][General] Neclaritate enunt: Dimensiune buffer | ||
+ | |||
+ | Exemple de așa nu: | ||
+ | |||
+ | * Problema la tema 2 | ||
+ | * eroare tema 2 | ||
+ | * eroare la dimensiuni | ||
+ | |||
+ | Revedeți și secțiunea de [[:so:info:lista-discutii|guidelines pentru lista de discuții SO]] | ||
+ | |||
+ | </note> |