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

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

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

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

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

Grundprogrammen. combine

printenv sort pager printenv grep args sort pager

HI1025 Operativsystem, KTH Haninge, VT2012

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Del II: Systemprogrammering och Inter-Process Communication.

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

Programmeringsteknik med C och Matlab

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

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

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

Pekare och arrayer. Indexering och avreferering

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

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

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Operativsystem ID1200/06 Tentamen :00-18:00

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

Det finns många flaggor till g++,

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

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Typkonvertering. Java versus C

Användbara systemanrop och biblioteksfunktioner. 2G1520 Operativsystem

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Avancerad SSL-programmering II

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Lite om länkade strukturer

*Pekarvärden *Pekarvariabler & *

Poster ( structar ) Postdeklarationer

Raspberry Pi och Tellstick, ett program i C.

Språket Python - Del 2 Grundkurs i programmering med Python

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

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

TDIU01 - Programmering i C++, grundkurs

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Programsystemkonstruktion med C++

Tentamen PC-teknik 5 p

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

Föreläsning 5: Introduktion av pekare

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

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

Operativsystem (IS1350) :00-12:00

Classes och Interfaces, Objects och References, Initialization

Hjälpmedel för kompilatorkonstruktion, DVB004

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

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

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Tentamen *:58/ID100V Programmering i C Exempel 3

Att använda pekare i. C-kod

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

grundläggande C++, funktioner m.m.

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Strängar. Strängar (forts.)

Föreläsning 6: Metoder och fält (arrays)

C-programmering, föreläsning 2 Jesper Wilhelmsson

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Programmeringsteknik med C och Matlab

Föreläsning 10. Pekare (Pointers)

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Operativsystem ID1200/06 Tentamen :00-18:00

Föreläsning 6: Introduktion av listor

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

2 Pekare och dynamiska variabler.

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

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

Stack och subrutiner Programmeringskonventionen

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

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

Olika shell. Skalprogrammering. Pipor och omdirigering av strömmar

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Kapitel 6 - Undantag

C++ - En introduktion

Introduktionslaboration

Operativsystem ID2200/06 tentamen och omtentamen :00-12:00

Kopiering av objekt i Java

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

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Transkript:

Vad händer när man kör ett program? När man kompilerar ett program och sedan länkar ihop det så stoppar länkaren in lite extra kod i programmet. Det är denna kod som i sin tur anropar main-funktionen ungefär som ni anropar underfunktioner. Den extra kod som kommer in har bland annat två syften: Se till att ditt C program får rätt omgivning att köras i och att städa upp efter ditt program när det är klart. Funktionsanrop Vad händer vid ett funktionsanrop (Principiell beskrivning) Man lägger upp nuvarande adress och parametrarna på stacken, sedan hoppar man iväg till funktionen. När denna funktion är klar så plockar man fram den gamla stackpekaren och den gamla adressen och återgår till att exekvera den koden. På samma sätt med main Den extra koden gör alltså likadant för main och ser till att kommandoradsargumenten går att nå som argument till main. Kommandoradsargument Här gäller samma sak som vid ett vanligt funktionsanrop; extrakoden läser in argumenten och lagrar dem i en strängarray, sedan så skickar den upp antalet argument och pekaren på stacken följt av ett anrop till main Avsluta programmet Normal Ett program kan avslutas normalt, dvs genom att man "rasar ut ur" main, man gör från main, man anropar eller _. Denna rutin städar upp lite granna efter ditt program innan den låter kärnan ta över igen. _ Här sker ingen städning alls utan man hoppar direkt tillbaka till kärnan Onormal Detta sker genom ett anrop till abort eller att en signal gör att programmet avslutas. Vi kommer att gå igenom detta på en senare lektion. Exithandlers Genom funktionen at så kan man registrera funktioner som exekveras sedan man har anropat. Se exempel i boken 7.3 _ or _Exit _ or _Exit Figure 7.2 How a C program is started and how it terminates user functions main function C start-up routine exec function _ user process handler... handler standard I/O cleanup Minneshantering Som ni känner till så kan man få mera minne till variabler etc vid behov. I C gör man det genom att anropa någon funktion i alloc-familjen malloc Den kanske vanligaste är malloc som ger dig en pekare till ett minnesutrymme av en viss storlek. Innehållet i minnesutrymmet är odefinierat när du få tillgång till det. oc oc ger dig möjlighet att får utrymme för X antal objekt av storleken Y. Det utrymme då får har "nollats realloc Om redan har ett utrymme för data men behöver ändra storleken så kan du använda dig av realloc. Notera att det existerade datat kan flyttas om så använd dig av den nya pekaren. Innehållet i det eventuella nya utrymmet är odefinierat Minneshantering forts. alloca alloca är lite speciellt i och med att den plockar utrymmet från stacken i stället för heapen. Det innebär att man inte behöver göra en free när rutinen är klar men å andra sidan så kan man bara använda den i funktionen eller i rutiner som anropas av den. free När man är klar med ett minnessegment så kan man lämna tillbaka det genom att anropa free

Processer Processer i kärnan Varje program körs i sin egen process. Använd getpid för att få reda på identifikationsnummer. Barn En process kan yngla av sig ("spawn") sub-processer genom att använda funktionen fork. Processerna kommer direkt efter anropet att se identiska ut (utom vad gäller returvärdet från fork) De delar ej minne med varandra. Innehållet i minnet kopieras ofta först då vi försöker förändra det (för att undvika att kopiera saker i onödan) Race conditions Det finns en uppenbar risk när fler än en process kör och de kommunicerar med varandra. Det är att processerna hamnar i en "tävlan" om vilken som kommer först till en viss punkt i koden. Detta kan ställa till stora problem (vi kommer att titta mer på detta senare i kursen). #include <stdio.h> #include <unistd.h> #include <sys/types.h> int var = 1; fork, exempel 1 pid = fork(); pid = fork(); printf("pid = %d, var = %d\n", getpid(), var); (0); fork, exempel 2 int var = 1; if ((pid = fork()) < 0) fprintf(stderr, "Error creating \n"); else if (pid == 0) /* Child */ var++; else /* Parent */ var--; printf("pid = %d, var = %d\n", getpid(), var); (0); char buf[] = "a write to stdout\n"; int size = sizeof(buf)-1; if (write(stdout_fileno, buf, size)!= size) printf("\n"); /* don't flush stdout */ if ((pid = fork()) < 0) else if (pid == 0) /* */ printf("\n"); else sleep(2); /* */ printf("\n"); printf("\n"); (0); testkörning kill och ps boule[2126] % a.out a write to stdout boule[2127] % boule[2127] % a.out > tst.txt boule[2128] % cat tst.txt a write to stdout boule[2129] % ps listar processer som körs. Kolla man ps för lämpliga flaggor (varierar lite mellan systemen) kill Kan användas för att avsluta en process kill pid

exec Man kan starta ett program genom att först göra en fork och sedan göra ett exec-anrop som i sin tur startar programmet. Det intressanta är att detta nya program kör i den process som skapades av fork-anropet. Det finns flera olika exec-funktioner. Beroende på vad man vill göra, hur man vill skicka med parametrar och vilka omgivningsvariabler man vill att programmet ska använda sig av Exec forts. int execl(const char *path, const char... /* (char *)0); int execle(const char *path, const char... /* (char *)0, char * envp[] */ ); int execlp(const char *file, const char... /* (char *)0); exec forts. execlp execl execle build argv build argv build argv execvp execv execve try each PATH prefix use environ int main(int argc, char *argv[]) if ((pid = fork()) < 0) else if (pid == 0) /* Child */ execl("/home/staff/mr/bin/envir", "MYprog", "umu", (char *) 0); if (waitpid(pid, NULL, 0) < 0) 0; pointer environ: list NULL strings HOME=/Home/staff/mr\0 PATH=/usr/local/bin:/usr/bin\0 SHELL=/usr/local/bin/tcsh USER=mr PRINTER=astrid getenv(const char *name) funktion för att läsa av ett värde som finns i en variable putenv(const char *str) tar en sträng på formen name=value och lägger till den till omgivningen setenv(const char *name, const char *value, int rewrite) unsetenv(const char *name) tar bort en definition av name Figure 7.5

wait high address low address stack heap uninitialized data initialized data text command-line arguments and variables initialized to zero by exec read from program file by exec Figure 7.6 pid_t wait(int *status) pid_t waitpid(pid_t pid, int *status, int options) ett anrop till wait/waitpid kan: blockera om alla barn fortfarande körs era omedelbart med statusen för barnet era omedelbart med en felkod (om processen saknar barn) Om barnet avslutas innan föräldern lagras info om processen (bla status) tills dess föräldern avslutas eller anropar wait för att läsa av infon barnet blir en zombie process Om föräldraprocessen avslutas innan barnet kommer föräldrarollen att övertas av init (pid 1) Macron för att undersöka statusen WEXITSTATUS(status) Tar fram status WIFEXITED(status) Kollar om processen avslutades normalt WIFSIGNALED(status) Sant om status indikerade att processen avslutades felaktigt (genom en signal) WIFSTOPPED(status) Sant om barnet stoppat Pipe Ett sätt kommunicera mellan olika processer är att använda s. Det finns flera sätt att kommunicera på (se sid 496), men s är den äldsta metoden och finns implementerat på alla system. Ett sätt att se på en är just som ett enkelriktat rör, man skickar in på ena sidan och plockar ut från den andra. För att skapa en så använder man funktionen int ( int filedes[2]) som erar två stycken 'file descriptors'. Den file descriptor som finns på index 0 är "läsändan' och den på 1 är "skrivändan". Skapa en Säg att jag nu vill skapa att ett program ska skapa en barnprocess och sätta upp en till den så att föräldern kan skicka information till barnet. Då kan man göra på följande sätt: 1. Anropa för att skapa själva n 2. Gör en fork för att få barnprocessen. Kom ihåg att barnet får en kopia av förälderns variabler etc, dvs barnet kommer att ha tillgång till de file descriptorer som n har. 3. Nu bör barnet stänga sin "skrivända 4. Och föräldern bör stänga sin "läsända" Figure 15.2 Half-duplex user process

Figure 15.3 Half-duplex after a fork Figure 15.4 Pipe from to fork Föräldern stänger läsänden och barnet stänger skrivänden.