This shows you the differences between two versions of the page.
so:laboratoare:laborator-04 [2019/03/09 17:19] stefan.aldoiu [Windows] |
so:laboratoare:laborator-04 [2022/03/29 20:51] (current) teodor_stefan.dutu [Exercițiul 2 - Normal signals vs Real-Time signals] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 04 - Semnale ====== | ====== Laborator 04 - Semnale ====== | ||
- | ===== Materiale ajutătoare ===== | ||
- | |||
- | *[[http://elf.cs.pub.ro/so/res/laboratoare/lab04-slides.pdf | lab04-slides.pdf]] | ||
- | *[[http://elf.cs.pub.ro/so/res/laboratoare/lab04-refcard.pdf | lab04-refcard.pdf]] | ||
Line 11: | Line 7: | ||
* TLPI - Chapter 20, Signals: Fundamental Concepts | * TLPI - Chapter 20, Signals: Fundamental Concepts | ||
* TLPI - Chapter 21: Signals: Signal Handlers | * TLPI - Chapter 21: Signals: Signal Handlers | ||
+ | |||
+ | ===== Link-uri către secțiuni utile ===== | ||
==== Linux ==== | ==== Linux ==== | ||
Line 22: | Line 20: | ||
* [[#Așteptarea unui semnal]] | * [[#Așteptarea unui semnal]] | ||
* [[#Timere în Linux]] | * [[#Timere în Linux]] | ||
+ | |||
Line 551: | Line 550: | ||
if (WaitForSingleObject(timerHandle, INFINITE) != WAIT_OBJECT_0) { | if (WaitForSingleObject(timerHandle, INFINITE) != WAIT_OBJECT_0) { | ||
- | fprintf("WaitForSingleObject failed (%d)\n", GetLastError()); | + | fprintf(stderr, "WaitForSingleObject failed (%d)\n", GetLastError()); |
exit(-1); | exit(-1); | ||
} | } | ||
Line 562: | Line 561: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | În rezolvarea laboratorului folosiți arhiva de sarcini [[http://elf.cs.pub.ro/so/res/laboratoare/lab04-tasks.zip | lab04-tasks.zip]]. | + | <note important> |
+ | În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://github.com/systems-cs-pub-ro/so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''git clone https://github.com/systems-cs-pub-ro/so''. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''git clone https://github.com/systems-cs-pub-ro/so ${target}''. | ||
- | <note tip> Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' din arhivă există un fișier ''utils.h'' cu funcții utile. </note> | + | Pentru a actualiza repository-ul, folosiți comanda ''git pull origin master'' din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările: |
+ | <code> | ||
+ | git stash | ||
+ | git pull origin master | ||
+ | git stash pop | ||
+ | </code> | ||
- | ==== Exercițiul -1 - GSOC ==== | + | Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. |
- | Google Summer of Code este un program de vară în care studenții | + | </note> |
- | (indiferent de anul de studiu) sunt implicați în proiecte Open Source | + | |
- | pentru a își dezvolta skill-urile de programare, fiind răsplătiți cu o | + | |
- | bursă a cărei valoare [[https://developers.google.com/open-source/gsoc/help/student-stipends|depinde de țară]] | + | |
- | ([[https://developers.google.com/open-source/gsoc|pagină principală GSOC]]). | + | |
- | UPB se află în top ca număr de studenți acceptați; în fiecare an fiind | + | <note tip> Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' există un fișier ''utils.h'' cu funcții utile. </note> |
- | undeva la aprox. 30-40 de studenți acceptați. | + | |
- | Vă încurajăm să aplicați! Există și un grup de fb cu foști | + | |
- | participanți unde puteti să îi contactați pentru sfaturi | + | |
- | [[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]]. | + | |
Line 602: | Line 594: | ||
</code> | </code> | ||
- | Încercați să trimiteți același semnal de două ori și explicați comportamentul. Ce ar trebui schimbat ca să se poată trimite același semnal de două ori? | + | === Repetare trimitere semnale === |
+ | |||
+ | Încercați să trimiteți același semnal de două ori și explicați comportamentul. | ||
+ | * **Ce ar trebui schimbat ca să se poată trimite același semnal de două ori?** | ||
* Analizați cu atenție ce este setat pe ''signals.sa_flags''. | * Analizați cu atenție ce este setat pe ''signals.sa_flags''. | ||
* Puteți reveni la secțiunea [[#Tratarea semnalelor|Tratarea semnalelor]] sau investigați structura [[http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html|sigaction]] | * Puteți reveni la secțiunea [[#Tratarea semnalelor|Tratarea semnalelor]] sau investigați structura [[http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html|sigaction]] | ||
<note tip>Observați că eliminarea flagului ''SA_RESETHAND'' nu mai reface handlerul la valoarea implicită după primirea primului semnal.</note> | <note tip>Observați că eliminarea flagului ''SA_RESETHAND'' nu mai reface handlerul la valoarea implicită după primirea primului semnal.</note> | ||
+ | |||
+ | === SIGSEGV === | ||
+ | |||
+ | Urmăriți comentariul din ''TODO 2'' și alte indicii pe care le găsiți în cod pentru a cauza un acces invalid la memorie. | ||
+ | * **Ce se întâmplă?** | ||
+ | |||
+ | <note tip>Dacă sunteți curioși ce se întâmplă în detaliu, puteți arunca cu ochiul în [[so:laboratoare-2013:laborator-07|laboratorul de memorie virtuală]].</note> | ||
==== Exercițiul 2 - Normal signals vs Real-Time signals ==== | ==== Exercițiul 2 - Normal signals vs Real-Time signals ==== | ||
Line 619: | Line 621: | ||
Citiți din pagina de manual ''man 7 signal'' secțiunea "Real-time signals" și revedeți secțiunea [[#Tipuri standard de semnale| Tipuri standard de semnale]]. | Citiți din pagina de manual ''man 7 signal'' secțiunea "Real-time signals" și revedeți secțiunea [[#Tipuri standard de semnale| Tipuri standard de semnale]]. | ||
- | <note tip>Diferența între numărul semnalelor primite se datorează faptului că semnalele cu indecșii între ''SIGRTMIN'' și ''SIGRTMAX'' sunt semnale real time, prin urmare se garantează că ele ajung la destinație. Vezi [[http://www.linuxprogrammingblog.com/all-about-linux-signals?page=9 | link]]. </note> | + | <note tip>Diferența între numărul semnalelor primite se datorează faptului că semnalele cu indecșii între ''SIGRTMIN'' și ''SIGRTMAX'' sunt semnale real time, prin urmare se garantează că ele ajung la destinație. </note> |
==== Exercițiul 3 - askexit ==== | ==== Exercițiul 3 - askexit ==== | ||
Line 669: | Line 671: | ||
==== Exercițiul 1 - timer ==== | ==== Exercițiul 1 - timer ==== | ||
- | Intrați în directorul ''1-timer'' și urmăriți conținutul fișierului ''mytimer.c''. Realizați un program care afișează data curentă la fiecare ''TIMEOUT'' secunde. | + | Intrați în directorul ''1-timer'' și urmăriți conținutul fișierului ''mytimer.c''. Realizați un program care afișează data curentă la fiecare 2 secunde. |
+ | Tipul [[https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-large_integer-r1|LARGE_INTEGER]] suportă mai multe moduri de setare a valorii, fie prin setarea a două %%"%%jumatăți%%"%%, mai exact componentele ''LowPart'' și ''HighPart'', fie accesând întreaga valoare, prin componenta ''QuadPart''. Pentru simplitate, folosiți componenta ''QuadPart'' a tipului ''LARGE_INTEGER'' pentru specificarea timeoutului, setându-l la macro-ul ''TIMEOUT''. | ||
- | Folosiți componenta ''QuadPart'' a tipului ''LARGE_INTEGER'' pentru specificarea timeout-ului. Timeout-ul este **negativ** și expiră la atingerea valorii ''0''. Al treilea argument al [[http://msdn.microsoft.com/en-us/library/ms686289(VS.85).aspx|SetWaitableTimerObject]] este timpul (în milisecunde) după care se va livra primul semnal de timer. | + | Observați că timeoutul este **negativ** și expiră la atingerea valorii ''0'', întrucât timerul funcționează incrementând valoarea acestui timeout, până la 0. Al treilea argument al [[http://msdn.microsoft.com/en-us/library/ms686289(VS.85).aspx|SetWaitableTimerObject]] este timpul **(în milisecunde)** la care se reactivează timerul. |
- | Folosiți un handler APC pentru tratarea timer-ului și afișarea mesajului. | + | Folosiți un handler APC pentru tratarea timer-ului și afișarea mesajului. |
* folosiți exemplul de utilizare a timer-elor cu APC-uri din [[http://msdn.microsoft.com/en-us/library/ms686898(VS.85).aspx|documentația MSDN]]. | * folosiți exemplul de utilizare a timer-elor cu APC-uri din [[http://msdn.microsoft.com/en-us/library/ms686898(VS.85).aspx|documentația MSDN]]. | ||
- | * ignorați warning-urile de compilare. | + | * ignorați warning-urile de compilare. |
* completați funcțiile din fișierul sursă. | * completați funcțiile din fișierul sursă. | ||
* folosiți [[http://www.kernel.org/doc/man-pages/online/pages/man3/ctime.3.html|ctime]] și [[http://www.kernel.org/doc/man-pages/online/pages/man2/time.2.html|time]] pentru afișarea timpului curent. | * folosiți [[http://www.kernel.org/doc/man-pages/online/pages/man3/ctime.3.html|ctime]] și [[http://www.kernel.org/doc/man-pages/online/pages/man2/time.2.html|time]] pentru afișarea timpului curent. | ||
- | * ctime adaugă un caracter new-line (''\n'') la sfârșitul șirului întors. | + | * ''ctime'' adaugă un caracter new-line (''\n'') la sfârșitul șirului întors. |
* folosiți [[http://msdn.microsoft.com/en-us/library/ms686307(VS.85).aspx|SleepEx]] și argumentele ''INFINITE'', pentru a aștepta nedefinit, și ''TRUE'', pentru a forța intrarea procesului într-o stare **alertabilă** (care să declanșeze rularea APC-ului). | * folosiți [[http://msdn.microsoft.com/en-us/library/ms686307(VS.85).aspx|SleepEx]] și argumentele ''INFINITE'', pentru a aștepta nedefinit, și ''TRUE'', pentru a forța intrarea procesului într-o stare **alertabilă** (care să declanșeze rularea APC-ului). | ||
- | * urmăriți secțiunea [[#Waitable Timer Objects]]. | + | * urmăriți secțiunea [[#Waitable Timer Objects]]. |
==== BONUS - Linux ==== | ==== BONUS - Linux ==== | ||
- | === so karma - timer === | + | === Timer === |
Intrați în directorul ''6-timer'' și urmăriți conținutul fișierului ''mytimer.c''. | Intrați în directorul ''6-timer'' și urmăriți conținutul fișierului ''mytimer.c''. | ||
Line 700: | Line 703: | ||
- | === so karma - timer === | + | === Timer (2) === |
Ramâneți în directorul ''6-timer''. Modificați sursa de la exercițiul anterior astfel încât să configurați funcția de handler direct din parametrii funcției [[http://www.kernel.org/doc/man-pages/online/pages/man2/timer_create.2.html|timer_create()]]. Urmăriți conținutul structurii ''sigevent''. Un exemplu găsiți [[http://nicku.org/ossi/lab/processes/programming-posix-threads/sigev_thread.c|aici]]. | Ramâneți în directorul ''6-timer''. Modificați sursa de la exercițiul anterior astfel încât să configurați funcția de handler direct din parametrii funcției [[http://www.kernel.org/doc/man-pages/online/pages/man2/timer_create.2.html|timer_create()]]. Urmăriți conținutul structurii ''sigevent''. Un exemplu găsiți [[http://nicku.org/ossi/lab/processes/programming-posix-threads/sigev_thread.c|aici]]. | ||
- | |||
- | ===== Soluții ===== | ||
- | |||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab04-sol.zip | Soluții exerciții laborator 4]] | ||