Differences

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

Link to this comparison view

so:laboratoare:laborator-04 [2019/03/09 16:46]
stefan.aldoiu [Exercițiul -1 - GSOC (0p)]
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 ====
 +  * [[#​Generarea semnalelor]]
 +  * [[#​Transmiterea și primirea semnalelor]]
 +  * [[#Tipuri standard de semnale]]
 +  * [[#Mesaje pentru descrierea semnalelor]]
 +  * [[#Măști de semnale. Blocarea semnalelor]]
 +  * [[#Tratarea semnalelor]]
 +  * [[#​Semnalarea proceselor]]
 +  * [[#​Așteptarea unui semnal]]
 +  * [[#Timere în Linux]]
 +
 +
 +
 +
 +==== Windows ====
 +  * [[#Timere sub Windows]]
 +  * [[#Waitable Timer Objects]]
 +
 +
 ===== Semnale în Linux ===== ===== Semnale în Linux =====
  
Line 532: 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 543: 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-ulfolosiț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 (2p) ==== +===== Linux =====
- +
-  * Detalii desfășurare [[http://​ocw.cs.pub.ro/​courses/​so/​meta/​notare#​joc_interactiv|joc]]. +
- +
- +
-===== Linux (7p) =====+
 <note important>​ La folosirea ''​sigaction'',​ veți inițializa,​ în general, câmpul ''​sa_flags''​ al structurii ''​struct sigaction''​ la ''​0''​. </​note>​ <note important>​ La folosirea ''​sigaction'',​ veți inițializa,​ în general, câmpul ''​sa_flags''​ al structurii ''​struct sigaction''​ la ''​0''​. </​note>​
  
-==== Exercițiul 1 - hitme (1p) ====+==== Exercițiul 1 - hitme ====
  
 Intrați în directorul ''​1-hitme/''​ și analizați conținutul fișierului ''​hitme.c''​. Compilați și rulați programul. Intrați în directorul ''​1-hitme/''​ și analizați conținutul fișierului ''​hitme.c''​. Compilați și rulați programul.
Line 583: 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]]
Line 589: Line 603:
 <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>​
  
-==== Exercițiul 2 - Normal signals vs Real-Time signals ​(1p) ====+=== 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 ====
  
 Intrați în directorul ''​2-signals''​ și urmăriți conținutul fișierului ''​signals.c''​. Programul numără de câte ori se apelează handlerul de semnal în cazul trimiterii semnalelor ''​SIGINT''​ și ''​SIGRTMIN''​ Intrați în directorul ''​2-signals''​ și urmăriți conținutul fișierului ''​signals.c''​. Programul numără de câte ori se apelează handlerul de semnal în cazul trimiterii semnalelor ''​SIGINT''​ și ''​SIGRTMIN''​
Line 600: 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 ​(1p) ====+==== Exercițiul 3 - askexit ====
  
 Intrați în directorul ''​3-askexit''​ și urmăriți codul sursă. Programul face busy waiting, afișând la consolă numere consecutive. Intrați în directorul ''​3-askexit''​ și urmăriți codul sursă. Programul face busy waiting, afișând la consolă numere consecutive.
Line 612: Line 633:
   * Consultați secțiunea [[#Tratarea semnalelor]].  ​   * Consultați secțiunea [[#Tratarea semnalelor]].  ​
  
-==== Exercițiul 4 - nohup (2p) ====+==== Exercițiul 4 - nohup ====
  
 Intrați în directorul ''​4-nohup''​ și realizați un program, denumit ''​mynohup'',​ care simulează comanda [[http://​linux.die.net/​man/​1/​nohup|nohup]]. Programul primește, ca prim parametru, numele unei comenzi de executat. Restul parametrilor reprezintă argumentele cu care trebuie invocată comanda respectivă;​ lista de argumente poate fi nulă. Intrați în directorul ''​4-nohup''​ și realizați un program, denumit ''​mynohup'',​ care simulează comanda [[http://​linux.die.net/​man/​1/​nohup|nohup]]. Programul primește, ca prim parametru, numele unei comenzi de executat. Restul parametrilor reprezintă argumentele cu care trebuie invocată comanda respectivă;​ lista de argumente poate fi nulă.
Line 629: Line 650:
    * Consultați secțiunea [[#Tratarea semnalelor]] și secțiunile [[so:​laboratoare:​laborator-03#​Înlocuirea imaginii unui proces]] și [[so:​laboratoare:​laborator-02#​Redirectări]] din laboratoarele precedente.    * Consultați secțiunea [[#Tratarea semnalelor]] și secțiunile [[so:​laboratoare:​laborator-03#​Înlocuirea imaginii unui proces]] și [[so:​laboratoare:​laborator-02#​Redirectări]] din laboratoarele precedente.
 Folosirea comenzii ''​exit'',​ fie combinația de taste ''​Ctrl-d''​ nu va trimite un semnal SIGHUP procesului de sleep; puteți testa utilizând ''​sleep 120 &'',​ inchideți shell-ul curent utilizând una din cele 2 metode, iar după verificați că procesul înca rulează. Folosirea comenzii ''​exit'',​ fie combinația de taste ''​Ctrl-d''​ nu va trimite un semnal SIGHUP procesului de sleep; puteți testa utilizând ''​sleep 120 &'',​ inchideți shell-ul curent utilizând una din cele 2 metode, iar după verificați că procesul înca rulează.
-==== Exercițiul 5 - zombie ​(2p) ====+==== Exercițiul 5 - zombie ====
  
 Intrați în directorul ''​5-zombie''​ și urmăriți conținutul fișierelor ''​mkzombie.c''​ și ''​nozombie.c''​. Fiecare program va crea câte un proces copil nou, care doar va apela ''​exit''​. Intrați în directorul ''​5-zombie''​ și urmăriți conținutul fișierelor ''​mkzombie.c''​ și ''​nozombie.c''​. Fiecare program va crea câte un proces copil nou, care doar va apela ''​exit''​.
Line 646: Line 667:
 </​note>​ </​note>​
  
-===== Windows ​(2p) =====+===== Windows =====
  
-==== Exercițiul 1 - timer (2p) ====+==== 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 681: 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]] 
  
  
so/laboratoare/laborator-04.1552142768.txt.gz · Last modified: 2019/03/09 16:46 by stefan.aldoiu
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