Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:teme-new:tema-2 [2019/03/12 21:58]
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 162: Line 205:
   *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>​
so/teme-new/tema-2.1552420693.txt.gz · Last modified: 2019/03/12 21:58 by adrian.sendroiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0