Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avAlexander Andersson
1
Jonny Karlsson 12.2.2007 1 PROCESSPROGRAMMERING Föreläsning 2 (12.2.2007) Innehåll: -Processtruktur -Processklyvning och kodbyte -Avslutning av processer -Processynkronisering -Programmerade rörledningar -Namngivna rörledningar
2
2Jonny Karlsson 12.2.2007 Processtruktur Två olika processtyper i Unix: Huvudprocess-Föräldraprocess-Master Slavprocess-Barnprocess-Slave En föräldraprocess kan ha flera barnprocesser och en barnprocess endast en föräldraprocess
3
3Jonny Karlsson 12.2.2007 Processtruktur Alla öppna processer identifieras med en unik process-ID (PID) Specialprocesser: PIDAnvänds avFunktion 0kernel Systemprocessen 1initSköter om uppstart av Unix systemet efter ”reboot” 2pagedaemonAnsvarar för sökning i det virtuella minnessystemet pid_t getpid(void)returnerar nuvarande processens PID pid_t getppid(void)returnerar föräldraprocessens PID
4
4Jonny Karlsson 12.2.2007 Processklyvning Systemanropet fork() används i Unix för att starta upp en ny process från en innevarnade process. (kloning av en process).
5
5Jonny Karlsson 12.2.2007 Processklyvning pid_t fork (void) Öppnar en ny paralell process (barnprocess) som blir en fullständig kopia av förälderprocessen. Båda processerna fortsätter exekveringen som normalt genast efter fork() anropet. fork() funktionen returnerar ett heltal (pid_t) som kan ha följande värden: -1 =Error 0 = Barnprocess OK till barnprocessen >1=Barnprocessens PID till Föräldraprocessen fork() anropas en gång men returnerar två gånger. Barnprocessen mottar en nolla eftersom en barnprocess inte kan ha fler än en förälderprocess Förälderprocessen mottar den uppstartade barnprocessens PID, eftersom en förälder kan ha flera barnprocesser
6
6Jonny Karlsson 12.2.2007 Kodbyte Med kodbyte menas uppstart och exekvering av en programkod lagrat i en annan programfil. Används vanligtvis genast efter processklyvning (fork) och startar upp ett program som skall exekveras av barnprocessen. Funktioner för kodbyte: - execl(), execv(), execle(), execve(), execlp(), execvp() Se manualfilerna (man) int execl(char *name, char *arg1, char *arg2,...., char *argn, 0); namepekare på programkodens filnamn arg1pekare på teckensträng för uppstart av programkoden arg2pekare på parameter 1 arg2pekare på parameter 2 argn... Sista parameterAlltid 0
7
7Jonny Karlsson 12.2.2007 Avslutning av processer En process avslutas vanligen med exit(), return() eller _exit() kommondot i programmets main() funktion. void exit(int status) void _exit(int status) void return(int status) Dessa funktioner berättar för föräldraprocessen hur barnprocessen avslutats. status = 0vid normal processavslutning status = felkodvid processavslutning som förorsakats av ett fel.
8
8Jonny Karlsson 12.2.2007 Processynkronisering En föräldraprocess kan vänta på avslutning av en barnprocess med systemanropen wait() eller waitpid() pid_t wait (int *status); pid_t waitpid(pid_t pid, int *status, int options) se man fil pid_t Den avslutade barnprocessens PID statusEtt heltalsvärde som hänvisar till barnprocessens ”exit kod” Funktionerna wait() och waitpid() kan vid anropet reagera på tre olika sätt: 1.blockerar föräldraprocessen ifall barnprocessen fortfarande är aktiv 2.returnarar omeldelbart slutstatus från en redan avslutad barnprocess 3.returnerar omedelbart ett felmeddelande ifall föräldern inte har någon barprocess att vänta på
9
9Jonny Karlsson 12.2.2007 Processynkronisering status kan analyseras med ett antal makron definierade i sys/wait.h: WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status), WIFSTOPPED(status), WSTOPSIG(status) (se man wait för mera info) exempel: WEXITSTATUS(status)Returnerar barnprocessens ”exit kod”
10
10Jonny Karlsson 12.2.2007 Programmerade rörledningar Är det äldsta och fortfarande vanligaste sättet att förverkliga kommunication mellan UNIX-processer Används vanligen för kommunikation mellan en föräldraprocess och en eller flera barnprocesserBegränsningar: Kan endast användas mellan processer som är släkt med varandra i rakt nedstigande led. (minst en fork i mellan) Kommunikationen är Halv-Duplex (kommunikation möjlig endast i en riktning)
11
11Jonny Karlsson 12.2.2007 Programmerade rörledningar ATT SKAPA EN PROGRAMMERAD RÖRLEDNING En programmerad rörledning skapas i ett C-program med systemanropet pipe int pipe(int filedes[2]); pipe skapar, förutom själva rörledningen, ett par fildeskriptorer filedes[0]Pekar på rörledningens läsända filedes[1]Pekar på rörledningens skrivända Returnerar:0 vid framgång -1 vid misslyckande
12
12Jonny Karlsson 12.2.2007 Programmerade rörledningar ATT SKRIVA TILL ELLER LÄSA FRÅN EN RÖRLEDNING Skrivning till eller läsning från en programmerad rörledning kan göras på samma sätt som vid filhantering Man skriver till rörledningens skrivända: write(filedes[1], buffer, strlen(buffer)); och läser från rörledningens läsända: read(filedes[0], buffer, strlen(buffer)); En fildeskriptor kan associeras med en strömpekare med systemanropet fdopen strompek = fdopen(filedes[1], ”w”); strompek2 = fdopen(filedes[0], ”r”); Vartefter man kan skriva till rörledningen med fprintf(strompek,...) och läsa ur rörledningen med fscanf(strompek2,...)
13
13Jonny Karlsson 12.2.2007 Programmerade rörledningar STÄNGNING AV EN ÖPPEN RÖRLEDNING Görs på samma sätt som vid stängning av öppna filer: close(filedes[0]);Stänger rörledningens läsända close(filedes[1]);Stänger rörledningens skrivända
14
14Jonny Karlsson 12.2.2007 Programmerade rörledningar ANVÄNDNING AV PROGRAMMERADE RÖRLEDNINGAR Om samtidig kommunikation i båda riktningarna mellan två processer önskas, krävs två rörledningar Vanligen skapar föräldraprocessen först 2 rörledningar och kallar därefter på fork. Därefter stänger föräldra- och barnprocessen var sin ända av var sin rörledning.
15
15Jonny Karlsson 12.2.2007 Programmerade rörledningar För en process som uppstartats av barnprocessen till följd av kodbyte (execl) är deskriptortabellen (filedes[2] i exemplet tdigare) som skapats i förldraprocessen obekant. Man brukar därför koppla rörledningens läsända till standard input och skrivända till standard output i barnprocessen. Detta måste göras i barnprocessen före kodbyte. En rörlednings läsanda kopplas till standard input enligt följande: close(0)Standard input stängs dup(filedes[0])Skapar en kopia av rörledningens läsdeskriptor med lägsta möjliga deskriptorvärde (I detta fall 0 eftersom deskriptor 0 stängdes före dup close(filedes[0])Ursprungliga läsdeskriptorn stängs Efter detta kan barnprogrammet som uppstartats som följd av kodbyte läsa data ur rörledningen via deskriptor 0 eller strömpekare stdin En rörlednings skrivända kopplas till standard output på motsvarande sätt.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.