140 likes | 286 Views
PROCESSPROGRAMMERING. Föreläsning 1 (5.2.2008) Innehåll: Introduktion av kursen Program och processer Fildeskriptorer Filhantering Kommonoradbaserade rörledningar Felhantering. Introduktion av kursen. Omfattning: 5 sp Rekommenderat studieår: 2
E N D
PROCESSPROGRAMMERING Föreläsning 1 (5.2.2008) Innehåll: Introduktion av kursen Program och processer Fildeskriptorer Filhantering Kommonoradbaserade rörledningar Felhantering Jonny Karlsson 5.2.2008
Introduktion av kursen Omfattning: 5 sp Rekommenderat studieår: 2 Lärare: Jonny Karlsson (hemsida: http://people.arcada.fi/~karlssoj) Kursens hemsida: http://people.arcada.fi/~karlssoj/procprog Kurspresentation: Se kursens hemsida Jonny Karlsson 5.2.2008
Program och processer Ett program är en exekverbar (”körbar”) fil som finns lagrad t.ex. på en dators hårdskiva. När ett program exekveras läses programmets instruktioner först in till datorns minne där instruktionerna sedan en efter en exekveras. En process är en exekverande instans av ett program. Varje exekverande process i et UNIX system identifieras med en unik process ID nummer. Jonny Karlsson 5.2.2008
Fildeskriptorer En fildeskriptor är ett positivt heltal som kerneln använder för att identifiera de filer som hanteras av en specifik process. M.a.o. en process kommer åt en viss fil i filsystemet via en fildeskriptor. Jonny Karlsson 5.2.2008
Fildeskriptorer EXEMPEL printf(”hej”); /*skriver ut text till deskriptorn stdout (skärmen)*/ fprintf(stdout, ”hej”); /*samma*/ write(1, ”hej”, 3); /*samma*/ scanf(”%s”, text); /*läser in en teckensträng från deskriptorn stdin*/ fscanf(stdin, ”%s”, text); /*samma som ovan*/ read(0, text, sizeof(text)); fprintf(stderr, ”hej”) /*skriver ut text till deskriptorn stderr (skärmen) */ write(2, ”hej”, 3); /*samma*/ Jonny Karlsson 5.2.2008
Filhantering ATT ÖPPNA OCH STÄNGA EN FIL int open(const char *pathname, int flags, mode_t mode); Ett systemanrop som öppnar en given fil och returnerar en fildeskriptor pathname En char pekare som anger URL till filen som skall öppnas flags Anger olika optioner för filen som öppnas mode Anger filrättigheter för filen som öppnas Jonny Karlsson 5.2.2008
Filhantering Flags Endast ett av följande argument får användas: O_RDONLY Öppnar en fil för läsning O_WRONLY Öppnar en fil för skrivning O_RDWR Öppnar en fil för både läsning och skrivning O_APPEND Skriver till slutet på en fil, O_CREAT Skapar filen om den inte existerar. Kräver ett tredje argument som anger filrättigheterna för den skapdade filen. O_TRUNC Skriver över innehållet i en fil. O_EXECL Skapar ett felmeddelande tillsammans med O_CREAT ifall filen existerar. O_NONBLOCK Öppnar i ”icke-blockerande läge. O_SYNC Tvingar write funktionen att vänta på en fysisk I/O – operation Jonny Karlsson 5.2.2008
Filhantering Mode S_IRUSR user - read S_IWUSR user – write S_IXUSR user - ececute S_IRGRP group - read S_IWGRP group - write S_IXGRP group - execute S_IROTH other - read S_IWOTH other - write S_IXOTH other - execute Jonny Karlsson 5.2.2008
Filhantering Exempel: int deskr; deskr = open(”testfil.txt”, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); Öppnar filen testfil.txt för läsning och skrivning. Filen skapas om den inte finns och tilldelas skriv och läsrättigheter. Om filen finns och där redan finns innehåll i filen, sätts nytt inehåll till i slutet av filen (skriver ej över gammalt innehåll). Open funktionen returnerar det lägsta lediga fildeskriptorvärdet. Deskriptorerna 0, 1 och 2 är alltid reserverade för stdin, stdout, och stderr. Dessa förvalda deskriptorer kan omstyras till en fil genom att stänga någon av dessa deskriptorer före utförande av open. En fildeskriptor stängs med : int close(int deskr); Jonny Karlsson 5.2.2008
Filhantering LÄS- OCH SKRIVOPERATIONER ssize_t write(int fildeskr, const void *buffer, size_t buffersize); Skriver till filen som fildeskriptorn fildeskr refererar till. Returnerar antalet skrivna bytes eller -1 om fel uppstår. Exempel: deskr = open(.....); scanf(”%s”, buf); write(deskr, buf, strlen(buf)); /*Läser ett meddelande från tangentbordet och skriver in det i den fil deskr referarar till*/ Jonny Karlsson 5.2.2008
Filhantering ssize_t read(int deskr, void *buffer, size_t max_size); Läser ur filen som fildeskriptorn deskr refererar till. Returnerar antalet lästa bytes eller -1 om fel uppstår. Exempel: char *buffer; deskr = open(.....); read(deskr, buffer, 50); /*Läser innehållet ur filen deskr refererar till och sparar det i buffer*/ Jonny Karlsson 5.2.2008
Felhantering FUNKTIONSBIBLIOTEK FÖR FELHANTERING errno.h extern int errno; En integer som specificeras av funktioner då fel uppstår för att indikera exakt vad som gått fel. const char *sys_errlist[]; En global lista på felmeddelanden som inexeras av errno void perror(const char *message); En funktion som kan användas för att skriva ut ett felmeddelande till ”standard error” som beskriver det senast felet som uppstått under ett system- eller funktionsanrop. Skriver ut sys_errlist[errno]. Jonny Karlsson 5.2.2008
Felhantering char *strerror(int errnum); /*deklarerad i string.h*/ Returnerar en teckensträng som beskriver ett angivet felnummer eller ”unknown error message” om felnumret är okänt. Exempel 1: printf(”Felmeddelande nr %d betyder ’%s’, 1, strerror(1)); Ger skärmutskriften: ”Felmeddelande nr 1 betyder ’Operation not permitted’” Exempel 2: errno = 1; perror(”Felmeddelandeförklaring”); Ger skärmutskriften: ”Felmeddelandeförklaring : Operation not permitted” Jonny Karlsson 5.2.2008
Kommandoradsbaserade rörledingar Rörledningar (Pipes) är i UNIX ett sätt att överföra data mellan exekverande processer. Kommandoradsbaserade rörledningar är ett exempel på använding av rörledngar. Kommandot Program1|Program2 skickar innehållet i stdout från process1 till deskriptorn stdin i Process2 Meddelanden som skickas till deskriptorn stdout i Process1 visas ej på bildskärmen Meddelande till bildskärmen från Process1 är möjligt via deskriptorn stderr Jonny Karlsson 5.2.2008