Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 11 ( ) Innehåll: - Förmedling av fildeskriptorer
Jonny Karlsson Förmedling av fildeskriptorer En process skapar en fildeskriptor och den öppna fildeskriptorn skickas över till en/flera andra processer. Mycket användbart vid programmering av klient-server applikationer. Mycket typiskt går det till så att serverprocessen gör allt som behövs för att öppna en fil och sedan skickas den öppna fildeskriptorn över till anropande klientprocesser.
Jonny Karlsson Filhantering Kerneln använder 3 datastrukturer för filhantering och relationerna mellan dessa bestämmer hurdan effekt en process har på en annan vid delning av öppna fildeskriptorer: Processtabell (process table) Filtabell (file table) v-nod tabell (v-node table) Varje process är associerad med en processtabell vilken innehåller en tabell med öppna fildeskriptorer för varje process. Associerade med varje fildeskriptor är: Flaggor för fildeskriptorerna En pekare till en filtabell Kerneln uppehåller en filtabell för alla öppna filer. Varje filtabell innehåller: Filstatusflaggan för filen (read, write, append, nonblocking, m.m.) Nuvarande ”file offset” (bestämmer var följande read/write operation startar) En pekare på v-nod tabellen för filen
Jonny Karlsson Filhantering Varje öppen fil har en v-nod tabell. V-noden innehåller information om filtypen och pekare på funktioner som hanterar filen. V-nod tabellen innehåller även I-nod information vilket berättar bl.a. filägaren och filstorleken.
Jonny Karlsson Fildelning Två processer delar en öppen fil genom att använda två sparata filtabeller (båda processerna skapar en egen fildeskriptor med open())
Jonny Karlsson Fildelning Två processer delar en öppen fil genom att den ena processen skapar fildeskriptorn och överför denna till den andra processen
Jonny Karlsson Överföring av fildeskriptorer Det man egentligen vill åstadkomma vid överföring av fildeskriptorer är att två eller flere processer delar samma filtabell. Det som egentligen sker tekniskt är att man överför en pekare till en filtabell från en process till en annan. Dena pekare får första tillgängliga deskriptorvärde. Observera att båda processerna har inte samma deskriptornummer eftersom de fortfarande har skilda processtabeller. Om ena processen stänger sin fildeskripor är filen ändå fortfarande öppen för den andra processen.
Jonny Karlsson Att sända en fildeskriptor En fildeskriptor kan sändas över till en annan process genom en rörledning genom att använda ioctl() funktionen: ioctl(pd[1], I_SENDFD, deskr); pd[1]Deskriptorn för skrivändan i den rörledning genom vilken deskriptorn skall skickas. I_SENDFDKommandoflagga som berättar att en deskriptor skall skickas. deskrDen fildeskriptor som skall skickas.
Jonny Karlsson Att ta emot en fildeskriptor En fildeskriptor kan tas emot från en annan process från en rörledning genom att använda ioctl() funktionen: ioctl(pd[1], I_RECVFD, &deskrpek); pd[0]Deskriptorn för läsändan i den rörledning varifrån deskriptorn skall tas emot. I_RECVFDKommandoflagga som berättar att en deskriptor skall skickas. deskrpekEn pekare på en post av typen struct strrecvfd (Se nästa slide)
Jonny Karlsson Att ta emot en fildeskriptor struct strrecvfd { int fd;//den nya deskriptorn uid_t uid;//användar ID för avsändaren gid_t gid;//grupp ID för avsändaren char fill[8]; }