Carnegie Mellon 1 System'Level+I/O+15#213:'Introduc0on'to'Computer'Systems ''14th'Lecture,'Oct.'12,'2010'Instructors:''Randy'Bryant'and'Dave'O’Hallaron'Carnegie Mellon 2 Today+ Unix+I/O+ RIO+(robust+I/O)+package+ Metadata,+sharing,+and+redirecEon+ Standard+I/O+ Conclusions+and+examples+Carnegie Mellon 3 Unix+Files+ A+Unix+file+is+a+sequence+of+m+bytes:+ B0#,#B1#,#....#,#Bk#,#....#,#Bm)1# All+I/O+devices+are+represented+as+files:+ /dev/sda2++++(/usr+disk'par00on)' /dev/tty2++++(terminal)' Even+the+kernel+is+represented+as+a+file:+ /dev/kmem+ +(kernel'memory'image)'' /proc+++++++++++++ +(kernel'data'structures)'Carnegie Mellon 4 Unix+File+Types+ Regular+file+ File'containing'user/app'data'(binary,'text,'whatever)' OS'does'not'know'anything'about'the'format' other'than'“sequence'of'b ytes”,'akin'to'mai n'memory' Directory+file+ A'file'that'contains'the'names'and'loca0ons'of'other'files' Character+special+and+block+special+files+ Terminals'(character'special)'and'disks'(block'special)' FIFO+(named+pipe)+ A'file'type'used'for'inter#process'communica0on' Socket+ A'file'type'used'for'network'communica0on'between'processes'Carnegie Mellon 5 Unix+I/O+ Key+Features+ Elegant'mapping'of'files'to'devices'allows'kernel'to'export'simple'interface'called'Unix'I/O' Important'idea:'All'input'and'output'is'handled'in'a'consistent'and'uniform'way' Basic+Unix+I/O+operaEons+(syste m+calls):+++ Opening'and'closing'files' open()and'close() Reading'and'wri0ng'a'file' read()+and''write() Changing'the'current*file*posi/on+(seek)' indicates'next'off set'in to'fil e'to'read'or'write' lseek() B0+B1+•+•+•+ Bk'1+Bk+Bk+1+•+•+•+Current+file+posiEon+=+k+Carnegie Mellon 6 Opening+Files+ Opening+a+file+informs+the+kernel+that+you+are+geUng+ready+to+access+that+file+ Returns+a+small+idenEfying+integer+file*descriptor* fd == -1+indicates'that'an'error'occurred' Each+process+created+by+a+Unix+shell+be gins+lif e+with+three+open+files+associated+with+a+terminal:+ 0:'standard'input' 1:'standard'output' 2:'standard'error'int fd; /* file descriptor */ if ((fd = open("/etc/hosts", O_RDONLY)) < 0) { perror("open"); exit(1); }Carnegie Mellon 7 Closing+Files+ Closing+a+file+informs+the+kernel+that+you+are+finished+accessing+that+file+ Closing+an+already+closed+file+is+a+recipe+for+disaster+in+threaded+programs+(more+on+this+later )+ Moral:+Always+check+return+codes,+even+for+seemingly+benign+funcEons+such+as+close() int fd; /* file descriptor */ int retval; /* return value */ if ((retval = close(fd)) < 0) { perror("close"); exit(1); }Carnegie Mellon 8 Reading+Files+ Reading+a+file+copies+bytes+from+the+current+file+posiEon+to+memory,+and+then+updates+file+posiEon+ Returns+number+of+bytes+read+from+file+fd+into+buf Return'type'ssize_t'is'signed'integer nbytes < 0+indicates'that'an'error'occurred' Short*counts+(nbytes < sizeof(buf)+)'are'possible'and'are'not'errors!'char buf[512]; int fd; /* file descriptor */ int nbytes; /* number of bytes read */ /* Open file fd ... */ /* Then read up to 512 bytes from file fd */ if ((nbytes = read(fd, buf, sizeof(buf))) < 0) { perror("read"); exit(1); }Carnegie Mellon 9 WriEng+Files+ WriEng+a+file+copies+bytes+from+memory+to+the+current+file+posiEon,+and+then+updates+curre nt+file+posiEon+ Returns+number+of+bytes+wriXen+from+buf+to+file+fd+ nbytes < 0+indicates'that'an'error'occurred' As'with'reads,'short'counts'are'possible'and'are'not'errors!'char buf[512]; int fd; /* file descriptor */ int nbytes; /* number of bytes read */ /* Open the file fd ... */ /* Then write up to 512 bytes from buf to file fd */ if ((nbytes = write(fd, buf, sizeof(buf)) < 0) { perror("write"); exit(1); }Carnegie Mellon 10 Simple+Unix+I/O+example+ Copying+standard+in+to+standard+out,+one+byte+at+a+Eme+#include "csapp.h" int main(void) { char c; while(Read(STDIN_FILENO, &c, 1) != 0) Write(STDOUT_FILENO, &c, 1); exit(0); } Note+the+use+of+error+handling+wrappers+for+read+and+write+(Appendix+A).+cpstdin.cCarnegie Mellon 11 Dealing+with+Short+Counts+ Short+counts+can+occur+in+these+situaEons:+ Encountering'(end#of#file)'EOF'on'reads' Reading'text'lines'from'a'terminal' Reading'and'wri0ng'network'sockets'or'Unix'pipes' Short+counts+never+occur+in+these+situaE ons:+ Reading'from'disk'files'(except'for'EOF)' Wri0ng'to'disk'files' One+way+to+deal+with+short+counts+in+your+code:+ Use'the'RIO'(Robust'I/O)'package'from'your'textbook’s'csapp.c+file'(Appendix'B)'Carnegie Mellon 12 Today+ Unix+I/O+ RIO+(robust+I/O)+package+ Metadata,+sharing,+and+redirecEon+ Standard+I/O+ Conclusions+and+examples+Carnegie Mellon 13 The+RIO+Package+ RIO+is+a+set+of+wrappers+that+provide+efficient+and+robust+I/O+in+apps,+such+as+network+programs+that+are+subject+to+short+counts+ RIO+provides+two+different+kinds+of+funcEons+ Unbuffered'input'and'output'of'binary'data' rio_readn'and'rio_writen Buffered'input'of'binary'data'and'text'lines' rio_readlineb'and'rio_readnb Buffered'RIO'rou0nes'are'thread#safe'and'can'be'i nterleaved'arbitrarily'on'the'same'descriptor' Download+from+hXp://csapp.cs.cmu.edu/public/code.html+++'''src/csapp.c and'include/csapp.hCarnegie Mellon 14 Unbuffered+RIO+Input+and+Output+ Same+interface+as+Unix+read+and+write Especially+useful+for+transferring+data+on+network+sockets+ rio_readn returns'short'count'only'if'it'encounters'EOF' Only'use'it'when'you' know'how'man y'bytes'to'read' rio_writen never'returns'a'short'count' Calls'to'rio_readn+and'rio_writen+can'be'interleaved'arbitrarily'on'the'same'descriptor'#include "csapp.h" ssize_t rio_readn(int fd, void *usrbuf, size_t n); ssize_t rio_writen(int fd, void *usrbuf, size_t n); Return:+num.+bytes+transferred+if+OK,**0+on+EOF+(rio_readn+only),+'1+on+error***Carnegie Mellon 15 ImplementaEon+of+rio_readn /* * rio_readn - robustly read n bytes (unbuffered) */ ssize_t rio_readn(int fd, void *usrbuf, size_t n) { size_t nleft = n; ssize_t nread;
View Full Document