<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=6._praktikum_-_Signaalid</id>
	<title>6. praktikum - Signaalid - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=6._praktikum_-_Signaalid"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=6._praktikum_-_Signaalid&amp;action=history"/>
	<updated>2026-10-28T17:16:04Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=6._praktikum_-_Signaalid&amp;diff=9461&amp;oldid=prev</id>
		<title>Irve – 11. oktoober 2012, kell 14:18</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=6._praktikum_-_Signaalid&amp;diff=9461&amp;oldid=prev"/>
		<updated>2012-10-11T14:18:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;et&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Vanem redaktsioon&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Redaktsioon: 11. oktoober 2012, kell 16:18&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l22&quot;&gt;22. rida:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;22. rida:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Paranda viga signaale printf() ajal blokeerides. Kasuta funktsiooni [http://linux.die.net/man/2/sigprocmask sigprocmask()], mis maskeerib signaalid. Võib-olla on huvitav vaadata funktsiooni [http://linux.die.net/man/3/sigemptyset sigemptyset()] manuaalilehele. Ära unusta algset signaalikomplekti pärast blokeeringu lõppu taastada. Seda nimetatakse kriitilise lõigu &amp;#039;&amp;#039;critical section&amp;#039;&amp;#039; kaitsmiseks. &amp;#039;&amp;#039;Näita siin tulemust õppejõule ja või salvesta programmist eraldi koopia&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Paranda viga signaale printf() ajal blokeerides. Kasuta funktsiooni [http://linux.die.net/man/2/sigprocmask sigprocmask()], mis maskeerib signaalid. Võib-olla on huvitav vaadata funktsiooni [http://linux.die.net/man/3/sigemptyset sigemptyset()] manuaalilehele. Ära unusta algset signaalikomplekti pärast blokeeringu lõppu taastada. Seda nimetatakse kriitilise lõigu &amp;#039;&amp;#039;critical section&amp;#039;&amp;#039; kaitsmiseks. &amp;#039;&amp;#039;Näita siin tulemust õppejõule ja või salvesta programmist eraldi koopia&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Päris programmide puhul ei ole signaalide iga printf() käsu eel blokeerimine otstarbekas. Kirjuta programm ümber nii, et &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; määrab globaalmuutuja, millesse signaali saabumisel kirjutatakse 1 ning 0 kui see veel saabunud ei ole. Trüki signaali saabudes saabunud signaalide arv; muul juhul toosama punkt. Ära unusta globaalmuutujat nullida.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Päris programmide puhul ei ole signaalide iga printf() käsu eel blokeerimine otstarbekas. Kirjuta programm ümber nii, et &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; määrab globaalmuutuja, millesse signaali saabumisel kirjutatakse 1 ning 0 kui see veel saabunud ei ole. Trüki signaali saabudes saabunud signaalide arv; muul juhul toosama punkt. Ära unusta globaalmuutujat nullida.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: Sealjuures tuleb märkida, et ka see lahendus ei ole päris korrektne ning signaale tuleb siiski blokeerida, kuid seekord globaalmuutuja kontrollimise ajaks selleks puhuks kui signaali töötlemise eel kohe järgmine signaal saabuma peaks (st enne, kui muutuja ennistatakse on võimalus, et signaal ära märgib, et ta just saabus ning siis toimuks ennistamine enne kui signaali saabumist märgataks; püüdke seda ette kujutada või nõudke selgitust). See tähendab, et signaalikontrolli hetk on kriitiline lõik ning sel ajal signaali vastu võtta ei saa. Kasuta andmetüübiks &#039;sig_atomic_t&#039; ning ütle, et muutuja on &#039;volatile&#039;. &#039;&#039;Näita tulemust&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:&lt;/ins&gt;:Sealjuures tuleb märkida, et ka see lahendus ei ole päris korrektne ning signaale tuleb siiski blokeerida, kuid seekord globaalmuutuja kontrollimise ajaks selleks puhuks kui signaali töötlemise eel kohe järgmine signaal saabuma peaks (st enne, kui muutuja ennistatakse on võimalus, et signaal ära märgib, et ta just saabus ning siis toimuks ennistamine enne kui signaali saabumist märgataks; püüdke seda ette kujutada või nõudke selgitust). See tähendab, et signaalikontrolli hetk on kriitiline lõik ning sel ajal signaali vastu võtta ei saa. Kasuta andmetüübiks &#039;sig_atomic_t&#039; ning ütle, et muutuja on &#039;volatile&#039;. &#039;&#039;Näita tulemust&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sealjuures peab tõe huvides mainima, et reaalselt on signaalide haldamine veelgi keerulisem, sest signaal võib saabuda signaali haldamise hetkel (ja haldusfunktsiooni töö katkestada). Selle parandamiseks tuleb kõik (või osad) signaalid &amp;#039;&amp;#039;handler&amp;#039;&amp;#039;i jooksmise ajal samuti blokeerida. Sellest lähtub ka komme &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; teha nii lühike kui võimalik ning nende (asünkroonset) saabumist sobival hetkel ise jälgida nagu viimases punktis tegite.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sealjuures peab tõe huvides mainima, et reaalselt on signaalide haldamine veelgi keerulisem, sest signaal võib saabuda signaali haldamise hetkel (ja haldusfunktsiooni töö katkestada). Selle parandamiseks tuleb kõik (või osad) signaalid &amp;#039;&amp;#039;handler&amp;#039;&amp;#039;i jooksmise ajal samuti blokeerida. Sellest lähtub ka komme &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; teha nii lühike kui võimalik ning nende (asünkroonset) saabumist sobival hetkel ise jälgida nagu viimases punktis tegite.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Jõudu tööle; loodetavasti oli huvitav harjutus.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Jõudu tööle; loodetavasti oli huvitav harjutus.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Irve</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=6._praktikum_-_Signaalid&amp;diff=9458&amp;oldid=prev</id>
		<title>Irve: Uus lehekülg: &#039;{{itv0020}} Vaatleme [http://en.wikipedia.org/wiki/Signal_(computing) signaale]. &#039;&#039;Signaalid&#039;&#039; on tarkvarakatkestustele sarnased, kuid neid hallatakse operatsioonisüsteemi tasem...&#039;</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=6._praktikum_-_Signaalid&amp;diff=9458&amp;oldid=prev"/>
		<updated>2012-10-11T13:30:48Z</updated>

		<summary type="html">&lt;p&gt;Uus lehekülg: &amp;#039;{{itv0020}} Vaatleme [http://en.wikipedia.org/wiki/Signal_(computing) signaale]. &amp;#039;&amp;#039;Signaalid&amp;#039;&amp;#039; on tarkvarakatkestustele sarnased, kuid neid hallatakse operatsioonisüsteemi tasem...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{itv0020}}&lt;br /&gt;
Vaatleme [http://en.wikipedia.org/wiki/Signal_(computing) signaale]. &amp;#039;&amp;#039;Signaalid&amp;#039;&amp;#039; on tarkvarakatkestustele sarnased, kuid neid hallatakse operatsioonisüsteemi tasemel ilma juurkasutaja õiguseid vajamata. Eri signaale eristavad täisarvukonstandid nagu näiteks SIGINT. Igal signaalil on oma number, SIGALRM taimerile, SIGINT katkestussignaalile jne.&lt;br /&gt;
&lt;br /&gt;
Signaalide haldamine POSIX süsteemis toimub kas [http://linux.die.net/man/2/signal signal()] või [http://linux.die.net/man/2/sigaction sicaction()] funktsioonidega. Esimene neist on ebasoovitatav kuid meie õppeotstarbel algul veidi mugavam kogeda. Mõlemad võimaldavad konkreetse signaali jaoks &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; funktsiooni registreerimist.&lt;br /&gt;
&lt;br /&gt;
= Signaalid klaviatuurilt =&lt;br /&gt;
&lt;br /&gt;
Protsessile signaali saatmiseks kasuta [http://linux.die.net/man/2/kill kill()] süsteemikäsku. Signaali saab käsurealt saata utiliidi &amp;#039;kill&amp;#039; abil, kui talle anda argumentideks protsessinumber ja signaalinumber. Kuigi seda on hea teada on see seekordse praktikumi mõttes ebamugavam.&lt;br /&gt;
&lt;br /&gt;
Mõningaid signaale saad saata ka klaviatuurilt:&lt;br /&gt;
# Ctrl-C saadab signaali INT (SIGINT), mis vaikimisi protsessi lõpetab&lt;br /&gt;
# Ctrl-\ saadab signaali QUIT  (SIGQUIT), mis lõpetab protsessi (seadistamisel antakse ka [http://en.wikipedia.org/wiki/Core_dump coredump]).&lt;br /&gt;
# Ctrl-Z saadab signaali TSTP (SIGTSTP), mis seiskab programmi ja viib meid käsureale tagasi. Kui soovite programmi taaskäivitada, kirjutage käsureal kas &amp;#039;fg&amp;#039; (foreground) või &amp;#039;bg&amp;#039; (background) utiliidi nimi.&lt;br /&gt;
# Ctrl-S saadab TSTP signaali, kuid käsurida ei anna. Programmi töö jätkamiseks vajuta CTRL+Q. &amp;#039;&amp;#039;See juhtub mõnikord kogemata kui olete CTRL+S abil salvestama harjunud.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Ülesanne =&lt;br /&gt;
&lt;br /&gt;
# Kirjuta väike programm mis on lõputus tsüklis ja trükib iga 1/2 sekundi järel punkti (.) (kasuta [http://linux.die.net/man/3/usleep usleep()] ja printf() käske. Lisa reavahetus, sest [http://www.gnu.org/s/libc/manual/html_node/Buffering-Concepts.html line-buffering] segab muidu punktide ilmumisele vahele. Vaata mis CTRL+C vajutamisel juhtub.&lt;br /&gt;
# Täienda programmi nii, et ta ^C kinni püüaks. (Väljumine käib CTRL+\ abil (kontrolli kas see töötab; alternatiiv oleks vajutada ^Z ning protsess selle käsu peale väljastatava numbri (PID) abil peatada.&lt;br /&gt;
# Täienda programmi nii, et ^C vajutamised oleks loetud ning trüki iga vajutamise peale see arv välja.&lt;br /&gt;
# Kui kirjutasid naiivse programmi (millele loodan), on olemas teoreetiline olukord, milles printf() põhitsüklis parajasti sel hetkel kirjutab kui &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; samuti kirjutada soovib. Kuna printf() ei ole &amp;#039;&amp;#039;[http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29 re-entrant]&amp;#039;&amp;#039;), võib see põhjustada vea. Selle vea põhjustamine antud programmis pole seni küll kellelgi õnnestunud, aga targemad raamatud on väitnud et see viga on seal olemas. Peame neid usaldama ja harjutusega edasi minema.&lt;br /&gt;
# Paranda viga signaale printf() ajal blokeerides. Kasuta funktsiooni [http://linux.die.net/man/2/sigprocmask sigprocmask()], mis maskeerib signaalid. Võib-olla on huvitav vaadata funktsiooni [http://linux.die.net/man/3/sigemptyset sigemptyset()] manuaalilehele. Ära unusta algset signaalikomplekti pärast blokeeringu lõppu taastada. Seda nimetatakse kriitilise lõigu &amp;#039;&amp;#039;critical section&amp;#039;&amp;#039; kaitsmiseks. &amp;#039;&amp;#039;Näita siin tulemust õppejõule ja või salvesta programmist eraldi koopia&amp;#039;&amp;#039;&lt;br /&gt;
# Päris programmide puhul ei ole signaalide iga printf() käsu eel blokeerimine otstarbekas. Kirjuta programm ümber nii, et &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; määrab globaalmuutuja, millesse signaali saabumisel kirjutatakse 1 ning 0 kui see veel saabunud ei ole. Trüki signaali saabudes saabunud signaalide arv; muul juhul toosama punkt. Ära unusta globaalmuutujat nullida.&lt;br /&gt;
: Sealjuures tuleb märkida, et ka see lahendus ei ole päris korrektne ning signaale tuleb siiski blokeerida, kuid seekord globaalmuutuja kontrollimise ajaks selleks puhuks kui signaali töötlemise eel kohe järgmine signaal saabuma peaks (st enne, kui muutuja ennistatakse on võimalus, et signaal ära märgib, et ta just saabus ning siis toimuks ennistamine enne kui signaali saabumist märgataks; püüdke seda ette kujutada või nõudke selgitust). See tähendab, et signaalikontrolli hetk on kriitiline lõik ning sel ajal signaali vastu võtta ei saa. Kasuta andmetüübiks &amp;#039;sig_atomic_t&amp;#039; ning ütle, et muutuja on &amp;#039;volatile&amp;#039;. &amp;#039;&amp;#039;Näita tulemust&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Sealjuures peab tõe huvides mainima, et reaalselt on signaalide haldamine veelgi keerulisem, sest signaal võib saabuda signaali haldamise hetkel (ja haldusfunktsiooni töö katkestada). Selle parandamiseks tuleb kõik (või osad) signaalid &amp;#039;&amp;#039;handler&amp;#039;&amp;#039;i jooksmise ajal samuti blokeerida. Sellest lähtub ka komme &amp;#039;&amp;#039;handler&amp;#039;&amp;#039; teha nii lühike kui võimalik ning nende (asünkroonset) saabumist sobival hetkel ise jälgida nagu viimases punktis tegite.&lt;br /&gt;
&lt;br /&gt;
Jõudu tööle; loodetavasti oli huvitav harjutus.&lt;/div&gt;</summary>
		<author><name>Irve</name></author>
	</entry>
</feed>