• Nie Znaleziono Wyników

zapis do tych samych urządzeń, jeśli dane nie mogą być od razu przyjęte, zapisu gdy żaden proces nie ma go otwartego do odczytu, itp.

N/A
N/A
Protected

Academic year: 2022

Share "zapis do tych samych urządzeń, jeśli dane nie mogą być od razu przyjęte, zapisu gdy żaden proces nie ma go otwartego do odczytu, itp."

Copied!
6
0
0

Pełen tekst

(1)

Z a aw a n so w a n e o p e ra cj e w e ci a / w y ci a

WitoldPaluszyński witold.paluszynski@pwr.edu.pl http://www.kcir.pwr.edu.pl/ witold/ Copyrightc 2002–2003WitoldPaluszyński Allrightsreserved. Niniejszydokumentzawieramateriałydowykładunatematzaawansowanychoperacji wejścia/wyjściawsystemieUnix.Jestonudostępnionypodwarunkiemwykorzystania wyłączniedowłasnych,prywatnychpotrzebimożebyćkopiowanywyłączniewcałości, razemzniniejsząstronątytułową.

B lo k o w a n ie o p e ra cj i I/ O

Blokowanieoperacjiwejścia/wyjściaoznaczaoczekiwanienamożliwośćodczytania albozapisaniadanych.Przykładyblokowaniawejścia/wyjścia: •odczytzplikówurządzeń,gdyniemawnichjużdanych(potoki,terminale, gniazdka), •zapisdotychsamychurządzeń,jeślidaneniemogąbyćodrazuprzyjęte, •otwarcieplikublokujedomomentuspełnieniapewnychwarunków(np.otwarcie plikuterminaladochwilinawiązaniapołączeniaprzezmodem,otwarcieFIFOdo zapisugdyżadenprocesniemagootwartegodoodczytu,itp.), •operacjenaplikachzmandatoryrecordlocking, •iinne. Unix:zaawansowaneoperacjeI/O3

N ie b lo k u ce w e ci e / w yj śc ie

BlokowanieoperacjiI/Omożnakontrolować,toznaczymożnatakskonfigurować operacjewejścia/wyjścia,bywsytuacjiktóranormalniespowodowałabyblokowanie, funkcjawróciłaodrazuzkodemwskazującymniemożnośćwykonaniaoperacji. •openzflagąONONBLOCK •fcntlnaotwartymdeskryptorzeztąsamąflagą Wtedypowrótzfunkcjiread/writenastępujezbłędemwskazującym,żeoperacjaby blokowała. UWAGA:możnazastosowaćstarąflagęONDELAY,wtedyfunkcjeread/write zwracają0,cojednakpokrywasięzsygnalizacjąEOF(SystemV). Unix:zaawansowaneoperacjeI/O4

(2)

R ó w n o cz e sn e o p e ra cj e I/ O

Jakzorganizowaćoperacjewejścia/wyjścia,gdymamynp.jednocześniekilkaźródeł, zktórychnadchodządane? Naprzykład,emulatorterminala,komunikującysięzednejstronyzużytkownikiem, azdrugiejzezdalnymsystemem: Możliwesąnastępującerozwiązania: •polling:nieblokującepróbyodczytunaprzemianzkolejnychdeskryptorów; wniektórychsystemachmożnateżużyćnagniazdkach: ioctl(fd,FIONREAD,&nread); •przełączanie(multiplexing):funkcjeselectipoll •asynchroniczneI/O:powiadamianieprocesuprzezjądro(przypomocysygnału) ogotowoścideskryptoradooperacjiI/O Unix:zaawansowaneoperacjeI/O5 Unix:zaawansowaneoperacjeI/O6

I/ O m u lt ip le xi n g

TenmechanizmniejestobjętynormąPOSIX,jednakfunkcjaselectistnieje wUnixachAT&TiBSDoddawnaijestdośćstandardowa.Funkcjapolljestnowa, iwniektórychsystemachjestzaimplementowanaprzezselect. structtimeval{ time_ttv_sec;/*seconds*/ suseconds_ttv_usec;/*andmicroseconds*/ }; intselect(intnfds,fd_set*readfds,fd_set*writefds, fd_set*errorfds,structtimeval*timeout); FunkcjaselectzwracaliczbędeskryptorówgotowychdooperacjiI/O.Popowrocie wynikającymzupłynięciazadanegoczasufunkcjazerujewszystkiezbiorydeskryptorów wsystemieV,leczpozostawiajeniezmienionewsystemieBSD.Tesystemyrównież inaczejlicządeskryptorygotowedoI/O(AT&Tliczyjewsensiemnogościowym, aBSDsumujearytmetycznielicznościwszystkichtrzechzbiorówdeskryptorów). Ponadto,niektóresystemywprzypadkugotowoścideskryptoraustawiająwstrukturze timevalczaspozostałydowyczerpania(Linux). Unix:zaawansowaneoperacjeI/O7 Dotworzeniaodpowiednichzbiorówdeskryptorów,atakżesprawdzaniaotrzymanych wyników,istniejąmakra: voidFD_SET(intfd,fd_set*fdset); voidFD_CLR(intfd,fd_set*fdset); intFD_ISSET(intfd,fd_set*fdset); voidFD_ZERO(fd_set*fdset); Funkcjapollzapewniapodobnedziałanieleczinnyinterfaceprogramisty: structpollfd{ intfd;/*filedescriptor*/ shortevents;/*requestedevents*/ shortrevents;/*returnedevents*/ } intpoll(structpollfdfds[],nfds_tnfds,inttimeout); Tablicastrukturpollfdokreślawszystkiedeskryptoryizdarzenia,naktórechcemy oczekiwać(czasokreślanyjesttuwmilisekundach).Wartośćzwracanazfunkcjidaje liczbęgotowychdeskryptorów. Unix:zaawansowaneoperacjeI/O8

(3)

F u n k cj a s e l e c t p ro st y p rz yk ła d

Poniżejminimalnyitrywialnyprzykładużyciafunkcjiselect.Wtymprzypadku obsługiwanyjesttylkojedendeskryptor,więctutajużycieselectniejestkonieczne. #include<sys/types.h> #include<sys/time.h> #include<stdio.h> #include<fcntl.h> #include<sys/ioctl.h> #include<unistd.h> intmain(){ charbuffer[128]; intresult,nread; fd_setinputs,testfds; structtimevaltimeout; FD_ZERO(&inputs); FD_SET(0,&inputs); while(1){ testfds=inputs; timeout.tv_sec=2; timeout.tv_usec=500000; result=select(FD_SETSIZE,&testfds, (fd_set*)0, (fd_set*)0, &timeout);

switch(result){ case0: printf("timeout\n"); break; case-1: perror("select"); exit(1); default: if(FD_ISSET(0,&testfds)){ ioctl(0,FIONREAD,&nread); if(nread==0){ printf("keyboarddone\n"); exit(0); } nread=read(0,buffer,nread); buffer[nread]=0; printf("read%dfromkeyboard:%s", nread,buffer); } break; }//switch }//while }//main Unix:zaawansowaneoperacjeI/O9

F u n k cj a s e l e c t b ar d zi e j re a li st yc zn y p rz yk ła d

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<sys/time.h> #include<sys/ioctl.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> intmain(){ intserv_len,serv_sock,cli_sock,result; structsockaddr_inserv_addr; fd_setreadfds,testfds; serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(9734); serv_len=sizeof(serv_addr); serv_sock=socket(AF_INET,SOCK_STREAM,0); bind(serv_sock,(structsockaddr*)&serv_addr,serv_len); listen(serv_sock,5); Unix:zaawansowaneoperacjeI/O10

FD_ZERO(&readfds); FD_SET(serv_sock,&readfds); while(1){ charch; intfd,nread; testfds=readfds; printf("serverwaiting\n"); result=select(FD_SETSIZE,&testfds,(fd_set*)0, (fd_set*)0,(structtimeval*)0); if(result<1){ perror("select"); exit(1); } for(fd=0;fd<FD_SETSIZE;fd++){ if(FD_ISSET(fd,&testfds)){ if(fd==serv_sock){ printf("addingclientonfd%d\n",cli_sock); cli_sock=accept(serv_sock,0,0); FD_SET(cli_sock,&readfds); } Unix:zaawansowaneoperacjeI/O11 else{ nread=read(fd,buf,sizeof(buf)); if(nread==0){/*nodata,clientclosedconnection*/ printf("removingclientonfd%d\n",fd); close(fd); FD_CLR(fd,&readfds); } else{ buf[nread]=0;/*terminatestring*/ printf("clientonfd=%d,msg=%s\n",fd,buf); sprintf(buf,"serverreplytoclient%d\n",fd); write(fd,buf,strlen(buf)+1); }//else... }//else... }//if(FD_ISSET(fd... }//for(fd=0... }//while(1)... }//main... Zwróćmyuwagęnato,żeużyciefunkcjiselectwpowyższymprzykładzierozwiązuje problemjednoczesnejobsługiwielupołączeńnaistniejącychgniazdkachklientów,oraz przyjmowanianowychpołączeńnagniazdkuserwera.Wprzypadkuużyciakomunikacji bezpołączeniowejwykorzystywanebyłobytylkogniazdkoserwera,ifunkcjaselectnie byłabypotrzebna. Unix:zaawansowaneoperacjeI/O12

(4)

A sy n ch ro n ic zn e I/ O

•Dlakażdegodeskryptora,dlaktóregochcemyoczekiwaćnadane,należyustawić powiadamianieprzezjądroodpowiednimsygnałem.Tenmechanizmrównieżniejest jednakobjętynormąPOSIXijesttrochęinnywsystemachAT&TiBSD. AT&TMechanizmdziaładlawszystkichurządzeńopartychnasystemie„streams”. NależyustawićsygnałSIGPOLLdladeskryptorafunkcją ioctl(fd,ISETSIG,flags);gdzieargumentemflagsokreślasięjakie wydarzeniepowinnospowodowaćwysłaniesygnału. BSDTumamydodyspozycjidwasygnały:SIGIO(dlazwykłychoperacjiI/O), iSIGURG(dladanychout-of-bandzpołączeńsieciowych).Należyustawićproces lubgrupęprocesów,któramaotrzymaćsygnałdladeskryptora(funkcjafcntl zkomendąFSETOWN),orazustawićflagęOASYNCdladeskryptora(funkcjafcntl zkomendąFSETFL). •Wchwiliotrzymaniasygnałunadalniewiemy,którydeskryptorjestgotówdo wykonywaniaoperacjiI/Oimusimytoitakpokoleisprawdzać. Unix:zaawansowaneoperacjeI/O13 Unix:zaawansowaneoperacjeI/O14

O d w zo ro w a n ie p li k ó w d o p a m ci

UżycieodwzorowaniaplikudopamięcipozwalawykonywaćoperacjeI/Onaplikuprzez manipulacjenapamięci.Zamiastprzesuwaćkursorplikufunkcjąlseek,wystarczy obliczyćinnyadreswpamięci.Odwzorowanierealizujefunkcjammap. Poniższewywołaniepowodujeodwzorowaniesekcjiotwartegoplikufildesodpozycji offodługościlendoobszarupamięciodadresuaddr.Adrestenmożebyćokreślony jako0,wtedyfunkcjasamawybieraobszarpamięciizwracajegoadres. pa=mmap(addr,len,prot,flags,fildes,off); Argumentprotokreślaprawadostępudoregionupamięciimusibyćzgodnyztrybem otwarciapliku. Argumentflagsokreślaróżneatrybutymapowanegoregionu: MAPSHAREDoperacjezapisudopamięcipowodujązapisdopliku MAPPRIVATEoperacjezapisudopamięciniepowodująmodyfikacjipliku— tworzonajestroboczakopiapliku MAPFIXEDwymuszaprzydziaładresuzadanyargumentem(normalniejeston tylkowskazówkądlajądra) MAPFILEflagawymaganawsystemieBSD Unix:zaawansowaneoperacjeI/O15

O p e ra cj e I/ O n a p li k a ch o d w zo ro w a n yc h d o p a m ci

WykonywanieoperacjiI/Oprzezodwzorowanąpamięćpozwalanawykorzystanie kanałówDMA,codajedużąszybkośćoperacjiI/Oiodciążeniegłównegoprocesora. Jeśliróżneprocesyodwzorujątensamplikdoswoichprzestrzeniadresowych,to uzyskujądziękitemuobszarpamięcipozwalającynakomunikacjęmiędzyprocesową. Zewzględunaefektywność,systemniewykonujenatychmiastoperacjiI/O wynikającychzzapisówdoodwzorowanejpamięci.Możnawymusićwykonanietych operacjifunkcjąmsync.Synchronizacjęmożnawywołaćwdowolnąstronę,tzn. zarównozapiszawartościpamięcidopliku,jakiwczytaniezawartościplikudopamięci. Zwykłezamknięcieodwzorowanegoplikuniekasujeodwzorowaniammap,należywtym celuwywołać: res=munmap(addr,len); SkasowanieodwzorowanianiepowodujeżadnychoperacjiI/Odopliku.Zapisdopliku wtrybieMAPSHAREDodbywasięnabieżącowtrakcieoperacjinaobszarzepamięci. Unix:zaawansowaneoperacjeI/O16

Cytaty

Powiązane dokumenty

„nieśpiewnej muzycz- ności”; u Ciebie muzyka jest ważna jako źródło inspi- racji (sam zresztą, jeśli się nie mylę, grasz na pianinie. A może raczej chodzi tu o

Mówiąc najprościej, Gellner stara się wyjaśnić dwa zdumiewające zjawiska współczesności: błyskawiczny i pokojowy zanik komunistycznego imperium wraz z ideologią

Prawdą również jest to, że intelekt człowieka nigdy nie pogodzi się z koncepcją „tylko-materialności” własnego ciała, nigdy nie zre- dukuje postawy wobec kategorii życia

Odważnym rozwiązaniem, które jednak może spotkać się z olbrzymim oporem własnego środowiska, byłoby bowiem wykorzystanie przynajmniej w pew- nym stopniu potencjału

Poprawne obliczenie, jaką odległość będzie miał do pokonania przez pół godziny orszak króla 1p.. Poprawne obliczenie, jaką odległość będzie miał do

W celu analizy właściwości mechanicznych wykonano wykresy przedstawiające krzywe rozciągania (naprężenie-odkształcenie) dla próbek wyciętych wzdłuż, prostopadle i

Od samego początku wokół budowy panowała nieprzyjazna atmosfera. Złym okiem na pomysły Zebrzydowskiego patrzył miejscowy awanturnik i watażka ze znanego

Przenoszenie zakażenia COVID-19 z matki na dziecko rzadkie Wieczna zmarzlina może zacząć uwalniać cieplarniane gazy Ćwiczenia fizyczne pomocne w leczeniu efektów długiego