CMPSC 311- Introduction to Systems Programming Module: Input/Output

Similar documents
Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

How do we define pointers? Memory allocation. Syntax. Notes. Pointers to variables. Pointers to structures. Pointers to functions. Notes.

CSE 410: Systems Programming

CMSC 216 Introduction to Computer Systems Lecture 17 Process Control and System-Level I/O

Preview. System Call. System Call. System Call. System Call. Library Functions 9/20/2018. System Call

Day21 A. Young W. Lim Wed. Young W. Lim Day21 A Wed 1 / 13

CSE 333 SECTION 3. POSIX I/O Functions

Systems Programming. COSC Software Tools. Systems Programming. High-Level vs. Low-Level. High-Level vs. Low-Level.

CS240: Programming in C

UNIX input and output

Summer June 15, 2010

Goals of this Lecture

I/O Management! Goals of this Lecture!

I/O Management! Goals of this Lecture!

CS246 Spring14 Programming Paradigm Files, Pipes and Redirection

Physical Files and Logical Files. Opening Files. Chap 2. Fundamental File Processing Operations. File Structures. Physical file.

UNIX System Programming

CSE 333 SECTION 3. POSIX I/O Functions

I/O OPERATIONS. UNIX Programming 2014 Fall by Euiseong Seo

Lecture 3. Introduction to Unix Systems Programming: Unix File I/O System Calls

Unix File and I/O. Outline. Storing Information. File Systems. (USP Chapters 4 and 5) Instructor: Dr. Tongping Liu

Standard File Pointers

Naked C Lecture 6. File Operations and System Calls

I/O OPERATIONS. UNIX Programming 2014 Fall by Euiseong Seo

Hyo-bong Son Computer Systems Laboratory Sungkyunkwan University

Section 3: File I/O, JSON, Generics. Meghan Cowan

Lecture 21 Systems Programming in C

Outline. OS Interface to Devices. System Input/Output. CSCI 4061 Introduction to Operating Systems. System I/O and Files. Instructor: Abhishek Chandra

What Is Operating System? Operating Systems, System Calls, and Buffered I/O. Academic Computers in 1983 and Operating System

Process Management! Goals of this Lecture!

CSC 271 Software I: Utilities and Internals

Operating System Labs. Yuanbin Wu

Chapter 10. The UNIX System Interface

CSci 4061 Introduction to Operating Systems. Input/Output: High-level

Lecture files in /home/hwang/cs375/lecture05 on csserver.

File Descriptors and Piping

CSI 402 Lecture 11 (Unix Discussion on Files continued) 11 1 / 19

Mode Meaning r Opens the file for reading. If the file doesn't exist, fopen() returns NULL.

Introduction. Files. 3. UNIX provides a simple and consistent interface to operating system services and to devices. Directories

Play with FILE Structure Yet Another Binary Exploitation Technique. Abstract

Operating systems. Lecture 7

Process Creation in UNIX

Input / Output Functions

Accessing Files in C. Professor Hugh C. Lauer CS-2303, System Programming Concepts

Systems Programming. 08. Standard I/O Library. Alexander Holupirek

C Basics And Concepts Input And Output

Programming in C. Session 8. Seema Sirpal Delhi University Computer Centre

CS240: Programming in C

System Calls and I/O Appendix. Copyright : University of Illinois CS 241 Staff 1

Operating Systems. Lecture 06. System Calls (Exec, Open, Read, Write) Inter-process Communication in Unix/Linux (PIPE), Use of PIPE on command line

Files. Eric McCreath

Processes often need to communicate. CSCB09: Software Tools and Systems Programming. Solution: Pipes. Recall: I/O mechanisms in C

CS 33. Files Part 2. CS33 Intro to Computer Systems XXI 1 Copyright 2018 Thomas W. Doeppner. All rights reserved.

OS COMPONENTS OVERVIEW OF UNIX FILE I/O. CS124 Operating Systems Fall , Lecture 2

Fall 2017 :: CSE 306. File Systems Basics. Nima Honarmand

Files and the Filesystems. Linux Files

Content. Input Output Devices File access Function of File I/O Redirection Command-line arguments

2009 S2 COMP File Operations

File (1A) Young Won Lim 11/25/16

CSC209H Lecture 6. Dan Zingaro. February 11, 2015

File IO and command line input CSE 2451

Inter-Process Communication

Shared Memory Memory mapped files

Data and File Structures Chapter 2. Basic File Processing Operations

Important Dates. October 27 th Homework 2 Due. October 29 th Midterm

All the scoring jobs will be done by script

Standard C Library Functions

Preview. Interprocess Communication with Pipe. Pipe from the Parent to the child Pipe from the child to the parent FIFO popen() with r Popen() with w

Topic 8: I/O. Reading: Chapter 7 in Kernighan & Ritchie more details in Appendix B (optional) even more details in GNU C Library manual (optional)

Files and Directories

PROGRAMMAZIONE I A.A. 2017/2018

All the scoring jobs will be done by script

File I/O. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

System Calls and I/O. CS 241 January 27, Copyright : University of Illinois CS 241 Staff 1

System Calls. Library Functions Vs. System Calls. Library Functions Vs. System Calls

CS 201. Files and I/O. Gerson Robboy Portland State University

File I/O. Dong-kun Shin Embedded Software Laboratory Sungkyunkwan University Embedded Software Lab.

Computer Architecture and Assembly Language. Practical Session 5

UNIX I/O. Computer Systems: A Programmer's Perspective, Randal E. Bryant and David R. O'Hallaron Prentice Hall, 3 rd edition, 2016, Chapter 10

POSIX Shared Memory. Linux/UNIX IPC Programming. Outline. Michael Kerrisk, man7.org c 2017 November 2017

Operating System Labs. Yuanbin Wu

Advanced Unix/Linux System Program. Instructor: William W.Y. Hsu

UNIX System Calls. Sys Calls versus Library Func

Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

File and Console I/O. CS449 Spring 2016

HIGH LEVEL FILE PROCESSING

Computer Programming: Skills & Concepts (CP1) Files in C. 18th November, 2010

System Software Experiment 1 Lecture 7

Computer Programming: Skills & Concepts (CP) Files in C

TCSS 422: OPERATING SYSTEMS

Lecture 9: File Processing. Quazi Rahman

EM108 Software Development for Engineers

File Access. FILE * fopen(const char *name, const char * mode);

Binghamton University. CS-211 Fall Input and Output. Streams and Stream IO

Lecture 23: System-Level I/O

25.2 Opening and Closing a File

CSI 402 Lecture 2 Working with Files (Text and Binary)

Binghamton University. CS-220 Spring Includes & Streams

System- Level I/O. Andrew Case. Slides adapted from Jinyang Li, Randy Bryant and Dave O Hallaron

CS 471 Operating Systems. Yue Cheng. George Mason University Fall 2017

Transcription:

CMPSC 311- Introduction to Systems Programming Module: Input/Output Professor Patrick McDaniel Fall 2014

Input/Out Input/output is the process of moving bytes into and out of the process space. terminal/keyboard (terminal IO) devices /dev kernel /proc secondary storage (disk IO) network (network IO) Page 2

Buffered vs. Unbuffered When the system is buffering It may read more that requested in the expectation you will read more later (read buffering) it may not commit all bytes to the target (write buffering) Page 3

Blocking vs. Nonblocking Non-blocking I/O The call does not wait for the read or write to complete before returning (just does its best) Thus a write/read may commit/return some, all, or none of the data requested When fewer than request bytes are read/written this is called a short read or short write Note: how you program I/O operations is dependent on the blocking behavior of I/O you are using. Page 4

Terminal IO There are three default terminal channels. STDIN STDOUT STDERR UNIX commands/programs for terminal output echo - prints out formatted output to terminal STDOUT e.g., echo hello world cat - prints out file (or STDIN) contents to STDOUT e.g., cat smsa_sim.c less - provides a read-only viewer for input (or file) e.g., less smsa_sim.c Page 5

IO Redirection Redirection uses file for inputs, outputs, or both Output redirection sends the output of a program to a file (redirects to a file), e.g., echo "cmpsc311 output redirection" > this.dat $ echo "cmpsc311 output redirection" > this.dat $ cat this.dat cmpsc311 output redirection Input redirection uses the contents of a file as the program input (re-directs from a file), e.g., cat < this.dat $ cat < this.dat cmpsc311 output redirection You can also do both at the same time, e.g., cat < this.dat > other.dat Page 6

Pipes Pipes take the output from one program and uses it as input for another, e.g., cat this.dat less You can also chain pipes together, e.g., cat numbers.txt sort -n cat 3$ cat numbers.txt 14 21 7 4 $ cat numbers.txt sort -n cat 4 7 14 21 $ Page 7

File IO File IO provides random access to a file within the filesystem: With a specific path (location of the file) At any point in time it has location pointer in the file Next reads and writes will begin at that position All file I/O works in the following way 1. open the file 2. read/write the contents 3. close the file Page 8

Locating files for IO An absolute path fully specifies the directories and filename itself from the filesystem root /, e.g., /home/mcdaniel/courses/cmpsc311-f14/this.dat An relative path is the directories and filename from (or relative to) the current directory, e.g.,./courses/cmpsc311-f14/this.dat courses/cmpsc311-f14/this.dat./this.dat All of these references go to the same file! Page 9

FILE* based IO One of the basic ways to manage input and output is to use the FILE set of functions provided by libc. The FILE structure is a set of data items that are created to manage input and output for the programmer. An abstraction of high level reading and writing files that avoids some of the details of programming. Almost always used for reading and writing ascii data (gdb) p *file $3 = {_flags = -72539008, _IO_read_ptr = 0x0, _IO_read_end = 0x0, _IO_read_base = 0x0, _IO_write_base = 0x0, _IO_write_ptr = 0x0, _IO_write_end = 0x0, _IO_buf_base = 0x0, _IO_buf_end = 0x0, _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain = 0x7ffff7dd41a0 <_IO_2_1_stderr_>, _fileno = 7, _flags2 = 0, _old_offset = 0, _cur_column = 0, _vtable_offset = 0 '\000', _shortbuf = "", _lock = 0x6020f0, _offset = -1, pad1 = 0x0, pad2 = 0x602100, pad3 = 0x0, pad4 = 0x0, pad5 = 0, _mode = 0, _unused2 = '\000' <repeats 19 times>} Page 10

libc libc is the standard library for the C programming language. In contains the code and interfaces we use to for basic program operation and interact with the parent operating system. Basics iterfaces: stdio.h declarations for input/outout stdlib.h declarations for misc system interfaces stdint.h declarations for basic integer data types signal.h declarations for OS signals and functions math.h declarations of many useful math functions time.h declarations for basic time handling functions many, many more Page

fopen() The fopen function opens a file for IO and returns a pointer to a FILE* structure: FILE *fopen(const char *path, const char *mode); Where, path is a string containing the absolute or relative path to the file to be opened. mode is a string describing the ways the file will be used For example, FILE *file = fopen( filename, "r+" ); Returns a pointer to FILE* if successful, NULL otherwise You don t have to allocate or deallocate the FILE* structure Page 12

fopen() The fopen function opens a file for IO and returns a pointer to a FILE* structure: FILE *fopen(const char *path, const char *mode); Where, path is a string containing the absolute or relative path to the file to be opened. mode is a string describing the ways the file will be used For example, A FILE* structure is also referred to as a stream. FILE *file = fopen( filename, "r+" ); Returns a pointer to FILE* if successful, NULL otherwise You don t have to allocate or deallocate the FILE* structure Page 13

fopen modes r - Open text file for reading. The stream is positioned at the beginning of the file. r+ - Open for reading and writing. The stream is positioned at the beginning of the file. w - Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ - Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. a Open for appending (writing at end of file). The file is created if it does not exist. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. Page 14

Reading the file There are two dominant ways to read the file, fscanf and fgets fscanf reads the data from the file just like scanf, just reading and writing, e.g., if ( fscanf( file, "%d %d %d\n", &x, &y, &z ) == 3 ) { printf( "Read coordinates [%d,%d,%d]\n", x, y, z ); } fgets reads the a line of text from the file, e.g., if ( fgets(str,128,file)!= NULL ) { printf( "Read line [%s]\n", str ); } Page 15

Writing the file There are two dominant ways to write the file, fprintf and fputs fprintf writes the data to the file just like printf, just reading and writing, e.g., fprintf( file, "%d %d %d\n", x, y, z ); fputs writes the a line of text to the file, e.g., if ( fputs(str,file)!= NULL ) { printf( "wrote line [%s]\n", str ); } Page 16

fflush FILE*-based IO is buffered fflush attempts to reset/the flush state int fflush(file *stream); FILE*-based writes are buffered, so there may be data written, but not yet pushed to the OS/disk. fflush() forces a write of all buffered data FILE*-based reads are buffered, so the current data (in the process space) may not be current fflush() discards buffered data from the underlying file If the stream argument is NULL, fflush() flushes all open output streams Page 17

fclose() fclose() closes the file and releases the memory associated with the FILE* structure. fclose( file ); file = NULL; Note: fclose implicitly flushes the data to storage. Page 18

Putting it all together... int show_fopen( void ) { // Setup variables int x, y, z; FILE *file; char *filename = "/tmp/fopen.dat", str[128]; file = fopen( filename, "r+" ); // open for reading and writing if ( file == NULL ) { fprintf( stderr, "fopen() failed, error=%s\n", strerror(errno) ); return( -1 ); } // Read until you reach the end while (!feof(file) ) { if ( fscanf( file, "%d %d %d\n", &x, &y, &z ) == 3 ) { printf( "Read coordinates [%d,%d,%d]\n", x, y, z ); } if (!feof(file) ) { fgets(str,128,file); // Need to get end of previous line if ( fgets(str,128,file)!= NULL ) { printf( "Read line [%s]\n", str ); } } } Page 19

Putting it all together... } // Now add some new coordinates x = 21; y = 34; z = 98; fprintf( file, "%d %d %d\n", x, y, z ); printf( "Wrote %d %d %d\n", x, y, z ); if ( fputs(str,file) >= 0 ) { printf( "wrote line [%s]\n", str ); } fflush( file ); // Close the file and return fclose( file ); return( 0 ); $ cat /tmp/fopen.dat 1 2 3 4 5 6 11 12 14 16 17 23 $./io This is cmpsc311, IO example Read coordinates [1,2,3] Read line [11 12 14 ] Read coordinates [16,17,23] Wrote 21 34 98 wrote line [11 12 14 ] $ cat /tmp/fopen.dat 1 2 3 4 5 6 11 12 14 16 17 23 21 34 98 11 12 14 $ Page 20

open() The open function opens a file for IO and returns an integer file handle: int open(const char *path, int flags, mode_t mode); Where, path is a string containing the absolute or relative path to the file to be opened. flags indicates the kind of open you are requesting mode sets a security policy for the file open() returns a file handle Page 21

open() flags The flags to open with O_RDONLY - read only O_WRONLY - write only O_RDWR - read and write Options O_CREAT - If the file does not exist it will be created. O_EXCL Ensure that this call creates the file, an fail otherwise (fail if already exists) O_TRUNC - If the file already exists it will be truncated to length 0. Note: You bitwise or ( ) the mode/options you want Page 22

Access Control in UNIX The UNIX filesystem implements discretionary access control through file permissions set by user The permissions are set at the discretion of the user Every file in the file system has a set of bits which determine who has access to the files User - the owner is typically the creator of the file, and the entity in control of the access control policy Group - a set of users on the system setup by the admin World - the set of everyone on the system Note: this can be overridden by the root user Page 23

UNIX filesystem rights There are three rights in the UNIX filesystem READ - allows the subject (process) to read the contents of the file. WRITE - allows the subject (process) to alter the contents of the file. EXECUTE - allows the subject (process) to execute the contents of the file (e.g., shell program, executable, ) Q: why is execute a right? Q: does read implicitly give you the right to execute? Page 24

UNIX Access Policy Really, this is a bit string encoding an access policy: rwx rwx rwx World Group Owner And a policy is encoded as r, w, x if enabled, and - if not, e.g, rwxrw---x Says user can read, write and execute, group can read and write, and world can execute only. Page 25

UNIX Access Policy Really, this is a bit string encoding an access policy: rwx rwx rwx World Group Owner And a policy is encoded as r, w, x if enabled, and - if $ not, ls -l. e.g, total 52 -rw-rw-r-- 1 professor mcdaniel 12 Oct 10 14:18 fopen.dat -rwxrwxr-x 1 professor mcdaniel rwxrw---x 12058 Oct 10 15:42 io -rw-rw-r-- 1 professor mcdaniel 1176 Oct 10 15:42 io.c -rw-rw-r-- 1 professor mcdaniel 88 Oct 10 14:17 Makefile Says user can read, write and execute, group can read -rw-rw-r-- 1 professor mcdaniel 15633 Oct 10 10:46 mmap.dat -rw-rw-r-- 1 professor mcdaniel 50 Oct 10 10:58 other.dat and write, and world can execute only. -rwxrwxr-x 1 professor mcdaniel -rw-rw-r-- 1 professor mcdaniel $ 154 Oct 10 10:58 redirect.sh 50 Oct 10 10:58 this.dat Page 26

Setting an access policy Specify a file access policy by bit-wise ORing ( ): S_IRWXU 00700 user (file owner) has read, write and execute S_IRUSR 00400 user has read permission S_IWUSR 00200 user has write permission S_IXUSR 00100 user has execute permission S_IRWXG 00070 group has read, write and execute permission S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 world has read, write and execute permission S_IROTH 00004 world has read permission S_IWOTH 00002 world has write permission S_IXOTH 00001 world has execute permission Page 27

Putting it together... So an open looks something like... // Setup the file for creating and open flags = O_WRONLY O_CREAT O_EXCL; // Create a NEW file (no overwrite) mode = S_IRUSR S_IWUSR S_IRGRP; // User can read/write, group read fhandle = open( filename, flags, mode ); if ( fhandle == -1 ) { fprintf( stderr, "open() failed, error=%s\n", strerror(errno) ); return( -1 ); } Q: But how is an int returned by open() a file? Page 28

File descriptor A file descriptor is an index assigned by the kernel into a table of file information maintained in the OS The file descriptor table is unique to each process and contains the details of open files. File descriptors are used to reference when calling the I/O system calls. The kernel accesses the file for the process and returns the results in system call response. Page 29

Reading and Writing Primitive reading and writing mechanisms that only process only blocks of opaque data: ssize_t write(int fd, const void *buf, size_t count); ssize_t read(int fd, void *buf, size_t count); Where fd is the file descriptor, buf is an array of bytes to write from or read into, and count is the number of bytes to read or write In both read() and write(), the value returned is the number of bytes read and written. Be sure to always check the result On reads, you are responsible for supplying a buffer that is large enough to put the output into. Page 30

close() close() closes the file and deletes the file s entry in the file descriptor table close( fhandle ); fhandle = -1; Note: Always reset your file handles to -1 to avoid use after close. Page 31

Putting it all together... int show_open( void ) { // Setup variables char *filename = "/tmp/open.dat"; int vals[1000] = { [0... 999] = 0xff }, vals2[1000];; int fhandle, flags; mode_t mode; // Setup the file for creating and open flags = O_WRONLY O_CREAT O_EXCL; // Create a NEW file (no overwrite) mode = S_IRUSR S_IWUSR S_IRGRP; // User can read/write, group read fhandle = open( filename, flags, mode ); if ( fhandle == -1 ) { fprintf( stderr, "open() failed, error=%s\n", strerror(errno) ); return( -1 ); } // Now write the array to the file if ( write(fhandle, (char *)vals, sizeof(vals))!= sizeof(vals) ) { fprintf( stderr, "write() failed, error=%s\n", strerror(errno) ); return( -1 ); } close( fhandle ); fhandle = -1; Page 32

Putting it all together... // Setup the file for reading flags = O_RDONLY; // Read an existing file fhandle = open( filename, flags, 0 ); if ( fhandle == -1 ) { fprintf( stderr, "open() failed, error=%s\n", strerror(errno) ); return( -1 ); } } // Now read the array from the file if ( read(fhandle, (char *)vals2, sizeof(vals2))!= sizeof(vals2) ) { fprintf( stderr, "read() failed, error=%s\n", strerror(errno) ); return( -1 ); } close( fhandle ); return( 0 ); $./io $ $ od -x -N 256 /tmp/open.dat 0000000 00ff 0000 00ff 0000 00ff 0000 00ff 0000 * 0000400 Page 33

fopen() vs. open() Key differences between fopen and open fopen provides you with buffering IO that may or may not turn out to be a faster than what you're doing with open. fopen does line ending translation if the file is not opened in binary mode, which can be very helpful if your program is ever ported to a non-unix environment. A FILE * gives you the ability to use fscanf and other stdio functions that parse out data and support formatted output. IMO: use FILE* style I/O for ASCII processing, and file handle I/O for binary data processing. Page 34

A parting note... Each of the styles of I/O requires a different set of include files FILE* requires: #include <stdio.h> file handle I/O requires: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> Page 35