Signaler. Icke tillförlitliga signaler. Vad göra?



Relevanta dokument
Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

... Funktionsanrop. Vad händer när man kör ett program?

HI1025 Operativsystem, KTH Haninge, VT2012

Tillfälle 14 (F): Fördjupat studium av parallellitet och synkronisering: processer, trådar, schemaläggning och signaler.

read Systemanrop i UNIX Exempel med read & write write int antal_tkn, fd, count; char buffer[size]; antal_tkn = read(fd, buffer, count);

printenv sort pager printenv grep args sort pager

Användbara systemanrop och biblioteksfunktioner. 2G1520 Operativsystem

Flera processer. Minneshantering. Trashing kan uppstå ändå. Ersätta globalt

Utkast. Programmering. Signals. Olika typer av program. Sommarkurs Avbrott i mjukvara.

Grundprogrammen. combine

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Datorteknik ERIK LARSSON

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Enkla datatyper minne

Tentamen PC-teknik 5 p Lösningar och kommentarer

Tentamen PC-teknik 5 p

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

UNIX verktyg. Användbara kommandon Fil och informationssökning Tags Versionshanteringssystem

Operativsystem (ID2200/06) XX XX:00-XX:00

Möte 10: Kommunikation mellan processer - (PI)

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

Datorsystemteknik Föreläsning 7DAVA14

HOFFER Walkie-talkie set PMR446/SSP3381 Svenska

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Trådar. Aktiva objekt

Operativsystem Lektion 1. Lärare. Schema. Kurssajten Finns på adressen. Jan Erik Moström. Set Norman

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Instruktion för konvertering av e-post i Lotus Notes med Swing PDF Converter

Operativsystem ID2200 Tentamen TEN1 3.8 hp :00-18:00

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Guido van Robot och olika UNIX-kommandon

Del II: Systemprogrammering och Inter-Process Communication.

Möte 9: Relationer mellan körande processer - (PI)

ZAP DVR-X3 Art.nr

Synkronisering - Semaforen. Om att vänta men inte i onödan

Mål. Datorteknik. Introduktion. Innehåll. Verklig situation - pappaledighet. Introduktion (forts)

Tentamen Nätverksprogrammering Lösningsförslag

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl

Mekanismer. (implementation)

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

MESI i Intel Core 2 Duo

Avancerad SSL-programmering I

CE_O3. Nios II. Inför lab nios2time

Fö 8: Operativsystem II. Minneshantering. Minneshantering (1) Minneshantering (2) Minneshantering och Virtuelltminne.

Carbon Regulator Quick Guide Den här manualen visar hur du ansluter och startar Carbon Regulator.

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Institutionen för elektro- och informationsteknologi, LTH

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Fö 8 TSEA81. Real-time Linux

Polling (cyklisk avfrågning) Avbrott

(Lösningsförslag finns sist i denna fil.)

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Föreläsning 3: Händelsestyrda program och användargränssnitt

const och pekare Output: char *unsafe(char *s) { // Returnerar pekare till det andra tecknet i s printf("%s \n", s);

Operativsystem. Hierarkin för hårdvara läses nerifrån

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

International Olympiad in Informatics July 2011, Pattaya City, Thailand Tävlingsuppgifter Dag 2 Svenska 1.3. Papegojor

Olika OS. Unix, Linux och Windows. Unix. Unix. En översikt av ett par OS. Titt på hur de gör. Många varianter. Mycket gemensamt. En del som skiljer

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Grundkurs Programmering

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

PROGES PLUS THERMOSCAN RF. Instruktionsmanual V

Svar till tentamen den 16 december 2013 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Datorteknik 2 (AVR 2)

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

C++ Slumptalsfunktioner + switch-satsen

Tentamen i Realtidsprogrammering

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

4 grundregler. Minneshantering. Problemet. Windows minkrav

Metoder (funktioner) Murach s: kap Winstrand Development

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Hur patchar man Entré?

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Version X6 Fler tips

Instruktion Ishockey

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Datorteknik. Föreläsning 4. Polling och avbrott. Institutionen för elektro- och informationsteknologi, LTH. Mål

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Tentamen PC-teknik 5 p

Operativsystem ID2206 Tentamen TEN1 4.5 hp :00-18:00

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Systembeskrivning. Systemskiss. Moduler.

Institutionen för datavetenskap 2014/15

Tentamen i ID2206, ID2200 samt IS1350 Operativsystem

Kapitel 4 Arkivmenyn Innehåll

Nemo96 HD och Nemo96 HD+ firmware uppdatering

Objektorienterad programmering

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Övning från förra gången: readword

Transkript:

Signaler Signaler Signaler kan betecknas som mjukvaruavbrott och du kan välja om du vill ta hand om dessa signaler eller strunta i dem. De funkar på ungefär samma sätt som hårdvaruavbrott och du kan definiera rutiner som tar hand om dem. Funktion De används oftast för liknande saker som hårdvaruavbrotten, dvs. signalera att något extra har hänt. Exempel på signaler är SIGALRM (alarm) och SIGCHLD (nåt har hänt med barnet till en process). Beroende på operativsystem så finns det flera olika varianter av signaler. Vissa definierar 15 stycken andra 31. För att få reda på den exakta funktionen och vilka som finns blir man tvungen att läsa dokumentationen för det aktuella operativsystemet. 138 139 Icke tillförlitliga signaler Vissa äldre unix-system implementerar signaler på ett sätt som inte är tillförlitligt!! I dessa är signaler inte är garanterade att verkligen komma fram till ditt program utan de kan försvinna på vägen. Det kan också vara problem med att själv skriva koden så att olika problem inte uppstår. 140 Vad göra? Vad ska man då göra åt dessa signaler? Välj mellan: Strunta i signalen Funkar för alla signaler (utom SIGKILL och SIGSTOP) men beroende på vad som genererade signalen så kan man få problem senare. Fånga signalen Skriv kod som tar hand om signalen och ser till att göra nåt (naturligtvis olika saker beroende på vad som har hänt). Default action Låt den fördefinierade koden ta hand om saken. Exakt vad som händer då finns beskrivet på sidan 292. Core Tillståndet för en process när den avslutas, kan användas för att ta reda på orsaken till varför processen avslutades. Genereras vid vissa signaler. 141

Några signaler och dess default Signal Value Action Comment ---------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no readers SIGALRM 14 Term Timer signal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGWINCH 28,28,20 Ign Window resize signal (4.3BSD, Sun) 142 Fånga signaler Signalhanterare kan registreras mha funktionen (funkar ej tillförlitligt på Solaris kolla fig. 10.18 för alt. impl) void (*signal (int sig, void (*disp)(int)))(int); eller med en typedef: typedef void Sigfunc(int) Sigfunc *signal(int, Sigfunc *); 143 Fånga signaler Tre konstanter i signal.h #define SIG_DFL (void (*)(int))0 Används för att sätta defaultbeteende #define SIG_ERR (void (*)(int))-1 Returneras av signal om något går fel #define SIG_IGN (void (*)(int))1 Används för att ignorera signalen Om signalhanteraren returnerar kommer koden att fortsätta där den avbröts av signalen. Även funktionen sigaction kan användas i detta syfte. Mer krånglig (och också mer uttrycksfull), men funkar alltid. 144 Speciella signaler Det finns några signaler som är lite speciella då de inte uppträder som alla andra. SIGABRT är en speciell i den meningen att du kan definiera en avbrottshanterare men om ett avbrott inträffar så kommer programmet att avbrytas. Det vill säga: efter det att din kod har exekverats så kommer inte kontrollen tillbaka till programmet utan programmet avslutas. SIGSTOP, SIGKILL är speciell i den meningen att den inte går att ta hand om, om du försöker så lyckas du inte. 145

Signaler under systemanrop Vad händer om man får en signal medan man gör ett systemanrop? Principen: om man har gjort ett "långsamt" systemanrop så avbryts detta anrop och man får tillbaka ett fel och felkoden (errno) är satt till EINTR. Varför: jo, om man fångar en signal så är det antagligen något man är intresserad av och man bör därför hoppa tillbaka så fort som möjligt Vissa system startar numera om ett flertal av de långsamma anropen som standard (dock ej Solaris) POSIX tillåter att de startas om, men har det ej som ett krav 146 Långsamma anrop Vad är då långsamma anrop? Jo, det är systemanrop som kan blockeras "för evigt": Filläsning De som kan blockeras för evigt om data inte finns tillgängligt (pipe, terminaler och nätverk) Filskrivning Samma som ovan open Open till filer som kan blockeras för evigt (t.ex. modem). pause och wait ioctl en del interprocess grejor Disk IO anrop gäller inte De kommer alltid tillbaka 147 Reentrant functions Kan en funktion anropas igen samtidigt som den redan exekveras? Ibland men ibland inte och gör man ett andra anrop på en funktion som inte är reentrant så ligger man pyrt till. Tabell 10.4 beskriver de funktioner som garanterat är reentrant och därmed med säkerhet kan anropas i signalhanterare. Följande måste gälla för att en funktion ska vara reentrant: 1. Håller inte reda på statiskt data 2. Skyddar globalt data genom att ta en lokal kopia av det 3. Får inte anropa andra funktioner som inte är reentrant 4. Får ej returnera referens till static-deklarerat data, och allt data tillhandahålls av anroparen. 148 _Exit() _exit() abort() accept() access() alarm() bind() Några funktioner som är reentrant fstat() getegid() geteuid() getgid() getgroups() getpid() getppid() pipe() poll() pselect() raise() read() recv() recvmsg() sigdelset() sigemptyset() sigfillset() sigismember() signal() sigpending() sigprocmask() chdir() chmod() chown() close() connect() creat() dup() dup2() execle() execve() fcntl() fork() getsockname() getsockopt() getuid() kill() link() listen() lseek() lstat() mkdir() mkfifo() open() pause() rename() rmdir() select() send() sendmsg() setgid() setpgid() setsid() setuid() shutdown() sigaction() sigaddset() sigset() sigsuspend() sleep() socket() socketpair() stat() sysconf() time() times() umask() uname() unlink() 149 utime() wait() waitpid() write()

Skicka signaler kill int kill(pid_t pid, int sig); Skickar signalen sig till PID (en process eller grupp av processer) PID måste vara en process vars real eller effective UID överensstämmer med anroparens effective eller real UID raise int raise(int sig); Med hjälp av denna funktion så kan en process skicka en signal till sig själv. alarm Används ofta i kombination med pause 150 Alarm unsigned int alarm(unsigned int sec) Ställer alarmklockan som tillhör den anropande processen att skicka signalen SIGALRM till processen efter sec sekunder. Endast ett larm kan vara inställt för en process. Om sec är 0, kommer ev. tidigare larm att tas bort. fork stänger av alla ev. alarm för nya processer. Exec-funktionerna förändrar ej ev. alarm som är satta för processen som anropar exec. Man får nödvändigtvis inte en alarmsignal efter 5 sekunder om man gör anropet alarm(5)! Det enda man kan vara säker på man får en alarmsignal någon gång efter 5 sekunder 151 int pause(void); Pause Stoppar upp den anropande processen tills den mottar en signal. Signalen måste vara en som inte ignoreras. Om signalen får processen att terminera så kommer pause ej att returnera. Om signalen fångas av den anropande processen och kontrollen återgår till programmet från signalhanteringsfunktionen, kommer den att fortsätta exekvera koden efter paus-anropet. Med alarm och pause så kan man låta en process somna och sedan vakna så att den kan göra nåt speciellt. sigsuspend lite mer avancerat systemanrop som kan åstadkomma samma sak 152 Blockera signaler Det finns funktioner för att förhindra signaler (man får välja vilka man vill förhindra) från att inträffa. Bör göras för viktiga partier i koden där någon viss signal inte får inträffa Signal sets Det finns möjlighet att hantera flera signaler samtidigt genom att definiera ett "signal set", se kap 10.11. Genom att sedan använda sigprocmask, 10.12 kan du sätta vilka signaler som för tillfället ska blockeras, etc. Om du vill kolla vilka signaler som väntar på att bli "levererade" så kan du använda sigpending, 10.13. 153

sigaction Efterföljare till signal funktionen int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact); struct sigaction har ett fält för signalhanteraren, ett med ett signal set som sätts innan signalhanteraren körs (efteråt återställs den till det den var innan). OSet lägger automatiskt till den inträffade signalen här (så att den blockeras) boken har en implementation av signal mha sigaction (10.18) Realtidsaspekter Som ni har sett så finns det en hel del problem som hör ihop med signaler. Det gäller att vara noggrann och se till att man inte har några missar i koden, tyvärr är detta inte så enkelt utan det är enkelt att missa. Dessa problem är inte något som enbart har med signalhantering att göra utan det ingår i det mer allmänna problemet med realtidsprogrammering. Det är mycket svårt att göra ett "säkert" system utan att ha tillgång till atomiska operationer. Om man tittar på de instruktioner som finns för olika processorer så finns det ofta en operation som är just odelbar, kanske "test-and-set", som sedan kan användas för att implementera odelbara funktioner på en högre nivå. 154 155