This shows you the differences between two versions of the page.
so:laboratoare:laborator-04 [2021/03/10 16:53] teodor_stefan.dutu [Exercițiul -1 - GSOC] Eliminare link Facebook |
so:laboratoare:laborator-04 [2022/03/29 20:51] (current) teodor_stefan.dutu [Exercițiul 2 - Normal signals vs Real-Time signals] |
||
---|---|---|---|
Line 550: | 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 574: | Line 574: | ||
</note> | </note> | ||
- | <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> | + | <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> |
- | + | ||
- | ==== Exercițiul -1 - GSOC ==== | + | |
- | Google Summer of Code este un program de vară în care studenții | + | |
- | (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 | + | |
- | undeva la aprox. 30-40 de studenți acceptați. | + | |
- | Vă încurajăm să aplicați! | + | |
Line 633: | 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 683: | 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]]. |
Line 718: | Line 707: | ||
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]] | ||