nchu system & network lab lab 13 file i/o & standard i/o

24
NCHU System & Network Lab NCHU System & Network Lab Lab 13 Lab 13 File I/O & Standard I/O

Post on 22-Dec-2015

231 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Lab 13Lab 13

File I/O & Standard I/O

Page 2: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

IntroductionIntroduction

• Each regular file, device, connection socket, directory…etc, are treated as a file by Linux.– We can perform I/O operations on these different

types of files.• Ex : open, read, write … etc

– We will start our discussion of these functions on:• Basic file I/O

• Standard I/O library

Page 3: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

File I/OFile I/O

• A set of methods dealing with files provided by Linux.

• Each opened file is referred to a file descriptor:– fd is a non-negative integer .– creat() and open() functions return a fd to pr

ocess.• UNIX system shells associate file descriptors :

– 0 : standard input

– 1 : standard output

– 2 : standard error

Page 4: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

File I/O (cont.)File I/O (cont.)

• These are functions introduced later :

#include <fcntl.h>#include <unistd.h>

int open (const char *pathname, int oflag, mode_t mode);

int creat (const char *pathname, mode_t mode);

int close (int filedes);

off_t lseek (int filedes, off_t offset, int whence);

ssize_t read (int filedes, void *buf, size_t nbytes);

ssize_t write (int filedes, const void *buf, size_t nbytes);

Page 5: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

open()open()

• A file is opened or created by calling open() function.– pathname is the name of the file.– This function has a multitude of options are specifie

d by oflag argument.– mode specifies the access permission of file.

#include <fcntl.h>

int open (const char *pathname, int oflag, mode_t mode);

Page 6: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

openopen (cont.) (cont.)• oflags of open()

Flags description

O_RDONLY Open for reading only

O_WRONLY Open for writing only

O_RDWR Open for reading and writing

O_APPEND Append to the end of file on each write

O_CREAT Create a file if it doesn’t exist. This requires mode argument

O_EXCL Generate an error if O_CREAT is set and the file already exists.

O_TRUNC If the file exists and is opened ,truncate its length to 0 .

O_NONBLOCK Set non-blocking mode on this opened file.

O_NOCTTY Do not allocate the device as the controlling terminal.

O_RSYNC Read operation on this fd waits until any pending writes finished.

O_DSYNC Each write wait for physical I/O to complete except file attributes.

O_SYNC Each write wait for physical I/O to complete ,include file attributes.

Page 7: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

creat()creat()

• This create function is equivalent to open (pathname, O_WRONLY|O_CREAT|O_TRUNC, mode)– One deficiency with creat() is that the file is op

ened only for writing.– A better way is to use open() with O_CREAT in

stead of creat().

#include <fcntl.h>

int creat (const char *pathname, mode_t mode);

Page 8: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

lseek()lseek()

• Every open file has an associated “current file offset”– A non-negative integer that measures the number of bytes f

rom the beginning of the file.

– Read/Write operation increments cur_offset value.

– The interpretation of the offset argument depends on the value of whence argument .

#include <unistd.h>

off_t lseek (int filedes, off_t offset, int whence);whence

SEEK_SET From the beginning

SEEK_CUR From the current file offset

SEEK_END From the end of the file

Page 9: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

read()/write()read()/write()

• Data is read from an open file with the read() function.– It will read nbytes bytes into buf from file filedes.

• Return values– Count number of read bytes , 0 if EOF, -1 on error

#include <unistd.h>

ssize_t read (int filedes, void *buf, size_t nbytes);ssize_t write (int filedes, void *buf, size_t nbytes);

Page 10: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

ConsistencyConsistency

• Traditional implementations of UNIX system have a buffer cache in the kernel which most disk I/O passes through.– Ex : delayed write– Three functions are provided to ensure consistency

of the file system on disk with the data of buffer.•sync()•fsync()•fdatasync()

#include <unistd.h>

int fsync (int fd);int fdatasync (int fd);

void sync(void);

Page 11: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Consistency (cont.)Consistency (cont.)• Sync ()

– It simply schedules all the modified block buffers in RAM to be write into disk , and it returns without waiting for write completed.

• fsync() – It refers only to a single file , specified by the fd, and wait

s for the disk writes to complete before returning.

• fdatasync() – It affects only data portions of a file.

Page 12: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Example : Basic I/OExample : Basic I/O#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#define BUFFERSIZE 1

int main(){

char buf[BUFFERSIZE];int in,out,readn;

in = open("file.in",O_RDONLY);out = open("file.out",O_WRONLY | O_CREAT,S_IRUSR | S_IWUSR);

while((readn = read(in,buf,sizeof(buf))) > 0)write(out,buf,readn);

exit(0);}

Page 13: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Standard I/O LibraryStandard I/O Library

• This library is specified by ISO C standard– Each opened file is associated with a stream.

– A file is opened with a FILE structure.• FILE is a structure that contains all information required

by the standard I/O library to manage the stream.

– Buffer allocation and optimal I/O.

Page 14: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Buffering of Standard I/OBuffering of Standard I/O

• The goal of the buffering is to use minimum number of read() and write() calls.– Types of buffering :

• Fully buffered

• Line buffered– The library performs I/O when a newline character is encounte

red.

• Unbuffered

Page 15: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Buffering of Standard I/O (cont.)Buffering of Standard I/O (cont.)

• We can change the buffering by calling these two functions before any other operations on the stream:

– setbuf() turns buffering on or off with a buffer buf of length BUFSIZ or NULL.

– setvbuf() specifies exactly which type of buffering.

#include <stdio.h>

void setbuf (FILE *restrict fp, char *restrict buf);int setvbuf (FILE *restrict fp, char *restrict buf, int mode, size_t size);

_IOFBF Fully buffered

_IOLBF Line buffered

_IONBF unbuffered

Page 16: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Opening a StreamOpening a Stream

• fopen() function opens a specified file and returns a *FILE pointer of the stream.

Mode description

r Open for reading

w Create for writing or truncate to 0 length

a Append, for writing at EOF

r+ Open for reading and writing

w+ Truncate to 0 length or create for R/W

a+ Open or create for R/W at EOF

#include <stdio.h>

FILE *fopen (char *restrict pathname, char *restrict type);

Page 17: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Other Functions for Standard I/OOther Functions for Standard I/O#include <stdio.h>

Int getc (FILE *fp);int fgetc (FILE *fp);int putc (FILE *fp);int fputc (int c,FILE *fp)

char *gets (char *buf);char *fgets (char *buf, int n, FILE *fp);char *puts (char *str);char *fputs (char *str, FILE *fp);

int printf (char *format, …);int fprintf (FILE *fp, const char *format, …);

int scanf (const char *restrict format, … );int fscanf (FILE *fp, char *format, …);

Page 18: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

File I/O vs. Standard I/OFile I/O vs. Standard I/O

• Standard I/O library ends up calling basic I/O routines .

• Standard I/O is specified by ISO C standard, and another one is specified by POSIX.1(Portable Operating System Interface) .– POSIX.1 includes ISO C standard library.

• fopen() deals with FILE structure whereas open() uses a file descriptor integer.

Page 19: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

File I/O vs. Standard I/O (cont.)File I/O vs. Standard I/O (cont.)

• More flexible buffering than basic I/O that take place with standard library.

• Device files only can be opened by open().

Page 20: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Example : Standard I/OExample : Standard I/O

Page 21: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

LabLab• I/O efficiency

– We want to know how does File I/O or standard I/O work to improve I/O efficiency.

• Create a 2MB file and copy it into a new output file.

• Use “clock()” to measure the process time of each case.

• Repeat the step above in different cases and show the result of all :– Basic I/O

» write() to output file 1 byte each time» write() to output file 64 bytes each time» open() with O_SYNC set , write()64 bytes each time» write() followed by fsync(), 64 byes each time

– Standard I/O» fopen() with setbuf( unbuffered )» fopen()

Page 22: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Lab (cont.)Lab (cont.)

• Clock()– Returns the number of clock ticks elapsed since the

program was launched.– CLOCKS_PER_SEC represents the number of

clocks in a second.#include <stdio.h>#include <time.h>

clock_t start,end;start = clock();delay(2000);end = clock();elapsetime = (end-start)/(double)CLOCKS_PERSEC ;

Page 23: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

Lab (cont.)Lab (cont.)

Page 24: NCHU System & Network Lab Lab 13 File I/O & Standard I/O

NCHU System & Network LabNCHU System & Network Lab

ReferenceReference•Advanced Programming in the UNIX Environment 2nd

Author : Richard Stevens, Stephen A.Rago, Publisher : Addison-Wesley

•Beginning Linux ProgrammingAuthor : Richard Stones, Neil Matthew Publisher : Wrox

•http://linux.vbird.org/•http://www.jollen.org/blog/ jollen’s Blog•http://www.cplusplus.com/ C++ Resource Network