The POSIX Layer CSE 333 Summer 2018

The POSIX Layer CSE 333 Summer 2018

L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Low-Level I/O – the POSIX Layer CSE 333 Summer 2018 Instructor: Hal Perkins Teaching Assistants: Renshu Gu William Kim Soumya Vasisht L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Lecture Outline v POSIX Lower-Level I/O 2 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Remember This Picture? Your program v Your program can access many layers of APIs: C standard § C standard library POSIX library § POSIX compability API glibc § Underlying OS system calls Linux system calls architecture-independent code architecture-dependent code Linux kernel 3 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 C Standard Library File I/O v So far you’ve used the C standard library to access files § Use a provided FILE* stream abstracRon § fopen(), fread(), fwrite(), fclose(), fseek() v These are convenient and portable § They are buffered § They are implemented using lower-level OS calls 4 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Lower-Level File Access v Most UNIX-en support a common set of lower-level file access APIs: POSIX – Portable Operang System Interface § open(), read(), write(), close(), lseek() • Similar in spirit to their f*() counterparts from C std lib • Lower-level and unbuffered compared to their counterparts • Also less convenient § You will have to use these to read file system directories and for network I/O, so we might as well learn them now 5 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 open()/close() v To open a file: § Pass in the filename and access mode • Similar to fopen() § Get back a “file descriptor” • Similar to FILE* from fopen(), but is just an int • Defaults: 0 is stdin, 1 is stdout, 2 is stderr #include <fcntl.h> // for open() #include <unistd.h> // for close() ... int fd = open("foo.txt", O_RDONLY); if (fd == -1) { perror("open failed"); exit(EXIT_FAILURE); } ... close(fd); 6 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Reading from a File v ssize_tssize_t read(read(intint fdfd,, void*void* bufbuf,, size_tsize_t count);count); § Returns the number of bytes read • Might be fewer bytes than you requested (!!!) • Returns 0 if you’re already at the end-of-file • Returns -1 on error § read has some surprising error modes… 7 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Read error modes v ssize_tssize_t read(read(intint fdfd,, void*void* bufbuf,, size_tsize_t count);count); § On error, read returns -1 and sets the global errno variable § You need to check errno to see what kind of error happened • EBADF: bad file descriptor • EFAULT: output buffer is not a valid address • EINTR: read was interrupted, please try again (ARGH!!!! ��) • And many others… 8 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 One way to read() � bytes int fd = open(filename, O_RDONLY); char* buf = ...; // buffer of appropriate size int bytes_left = n; int result; while (bytes_left > 0) { result = read(fd, buf + (n - bytes_left), bytes_left); if (result == -1) { if (errno != EINTR) { // a real error happened, so return an error result } // EINTR happened, so do nothing and try again continue; } else if (result == 0) { // EOF reached, so stop reading break; } bytes_left -= result; } close(fd); readN.c 10 L08: Low-Level I/O, C++ Preview CSE333, Summer 2018 Other Low-Level FuncTons v Read man pages to learn about: § write() – write data § fsync() – flush data to the underlying device § opendir(), readdir(), closedir() – deal with directory lisngs • Make sure you read the secRon 3 version (e.g. man 3 opendir) v A useful cheat sheet (from CMU): hgp://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture24.pdf v More in secRons this week…. 11 .

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    10 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us