This shows you the differences between two versions of the page.
so:teme-new:tema-2 [2019/03/13 21:24] razvan.crainea [Obiectivele temei] |
so:teme-new:tema-2 [2019/03/14 10:57] (current) razvan.crainea [Testare] |
||
---|---|---|---|
Line 2: | Line 2: | ||
<note important> | <note important> | ||
- | Dată publicare: **14 Martie 2019** | + | * Dată publicare: **14.03.2019** |
- | + | * <html><b><span style="color:blue;">Deadline</span></b></html>: **03.04.2019, ora 23:55** | |
- | Deadline: <html><span style="font-weight: bold;color:red;">3 Aprilie 2019, ora 23:55</span></html> | + | * <html><b><span style="color:red;">Deadline hard</span></b></html>: **10.04.2019, ora 23:55** |
- | + | ||
- | Deadline hard: <html><span style="font-weight: bold;color:red;">10 Aprilie 2019, ora 23:55</span></html> | + | |
</note> | </note> | ||
===== Obiectivele temei ===== | ===== Obiectivele temei ===== | ||
- | * TODO | + | * 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 temei ===== | ||
Line 55: | Line 57: | ||
===== 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 201: | 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 scop, 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> |