Frame & Frameless Landscape, Computing, Psychology

Download Report

Transcript Frame & Frameless Landscape, Computing, Psychology

System Programming
Chapter 5
Standard I/O Library
Announcement
• Programming assignment #1
– 3/15/2006 ~ 4/7/2006
• Bring your labtop PC (if you have one) for your next
class
– Active slides
Fun Video I
• Paper Windows (Queens, Canada) vs.
Graphical Windows
Fun Video II
• I/O Brush: The World as the Palette
(MIT Media Lab)
Document Your Code
• The more comments the better?
• Well documented:
– Some code explains itself.
– The comments are written for the readers to
understand the code not to misguide the readers.
What does the following code
fragment do?
// pi is a float, start with 0
float pi = 0;
// i is an integer, go from 0 to 10000
for (int i=0; i<10000; i++) {
// initialize the floats x an y with random numbers
float x = (float)rand() / RAND_MAX;
float y = (float)rand() / RAND_MAX;
// add .0004 to pi if x*x + y*y is smaller than 1
if ( x*x + y*y < 1 ) pi += .0004;
}
Calculation of Pi Using the Monte
Carlo Method
• The "Monte Carlo Method" is a method of
solving problems using statistics.
• The probability of randomly selecting a
point (x,y) inside the circle to that inside
the square is p/4.
# of randomly selected pointsinsidethe circle
# of randomly selected pointsin the square
(x, y)
The area of the circle
p
 The

area of the sqaure
4
Take a 2nd look
// estimate pi by using a Monte Carlo algorithm:
// get 10000 random points in the [0..1] x/y range
and use
// Pythagoras to check
// if they are inside the circle. Add 4/10000 for
each
// point within the circle.
float pi = 0;
for (int i=0; i<10000; i++) {
float x = (float)rand() / RAND_MAX;
float y = (float)rand() / RAND_MAX;
if ( x*x + y*y < 1 ) pi += .0004;
}
Contents
1. Preface/Introduction
2. Standardization and Implementation
3. File I/O
4. Standard I/O Library
5. Files and Directories
6. System Data Files and Information
7. Environment of a Unix Process
8. Process Control
9. Signals
10. Inter-process Communication
Standard I/O Library
• A major revision by Dennis Ritchie in 1975
based on the Portable I/O library by Mike
Lesk
• An ANSI C standard
– Easy to use and portable
– Details handled:
• Buffer allocation, optimal-sized I/O chunks, better
interface, etc.
Standard I/O Library
• Differences from File I/O
– File Pointers vs. File Descriptors
– fopen vs open
• When a file is opened/created, a stream is associated with the file.
• FILE object
– File descriptor, buffer size, # of remaining chars, an error flag, and the
like.
– stdin, sdtout, stderr defined in <stdio.h>
• STDIO_FILENO, STDOUT_FILENO,…
Unbuffered I/O
User
Process
Storage
Kernel
read( )
read( )
…
…
read( )
Buffered I/O
User
Process
Standard I/O
Buffer
gets( )
gets( )
…
gets( )
Kernel
Storage
Buffering
• Goal
– Use the minimum number of read and write calls.
• Types
– Fully Buffered
• Actual I/O occurs when the buffer is filled up.
• A buffer is automatically allocated when the first-time I/O is
performed on a stream.
• Meaning of “flush”: standard I/O lib vs terminal driver
Buffering
– Line Buffered
• Perform I/O when a newline char is encountered! – usually for
terminals.
• Caveats
– The filling of a fixed buffer could trigger I/O.
– The flushing of all line-buffered outputs if input is requested.
– Unbuffered
• Expect to output ASAP, e.g. using write()
• E.g., stderr
Buffering
• ANSI C Requirements
– Fully buffered for stdin and stdout unless interactive devices are
referred to.
• SVR4/4.3+BSD – line buffered
– Standard error is never fully buffered.
#include <stdio.h>
int fflush(FILE *fp);
– All output streams are flushed if fp == NULL
Buffering
#include <stdio.h>
void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);
– Full/line buffering if buf is not NULL (BUFSIZ)
• Terminals
– mode: _IOFBF, IOLBF, _IONBF (<stdio.h>)
– #define BUFSIZ 1024 (<stdio.h>)
– They must be called before any op is performed on the streams!
• What if you want to change it after some op?
Buffering
• Possible Memory Access Errors
– Use automatic allocation – NULL for *buf in setvbuf() –
bookkeeping
Mode
setbuf
_IOFBF
setvbuf
_IOLBF
_IONBF
Buf
Buffer and Length
Type of Buffering
Non-null
User buf or length BUFSIZE
Fully buffered or line
buffered
NULL
(no buffer)
Unbuffered
Non-null
User buf of length size
NULL
System buffer of appropriate length
Non-null
User buf of length size
NULL
System buffer of appropriate length
(ignored)
(no buffer)
Fully buffered
Line buffered
Unbuffered
Standard I/O Library - Open
#include <stdio.h>
FILE *fopen(const char *pathname, const char *type);
FILE *freopen(const char *pathname, const char *type, FILE *fp);
– fopen/freopen opens a specified file! – POSIX.1
• Close fp stream first!
– New files created by a or w have r/w rights for all
type
Description
r or rb
w or wb
a or ab
r+ or r+b or rb+
w+ or w+b or
wb+
a+ or a+b or ab+
Open for reading
Truncate to 0 length or create for writing
Append; open for writing at end of file, or create for writing
Open for reading and writing
Truncate to 0 length or create for reading and writing
Open or create for reading and writing at end of file
Standard I/O Library - Open
Type
r
File exists?
Y
Truncate
R
Y
W
W only at end
w
a
r+
w+
a+
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Standard I/O Library - Open
#include <stdio.h>
FILE *fdopen(int fildes, const char *type);
– Associate a standard I/O stream with an existing file descriptor –
POSIX.1
• Pipes, network channels
• No truncating for the file for “w”
– b (in rb, wb, ab, r+b, …) stands for a binary file – no effect for Unix
kernel
• O_APPEND supports multiple access.
• Interleaved R&W restrictions – intervening fflush (WR),
fseek(WR/RW), fsetpos (WR/RW), rewind (WR/RW), EOF
(RW)
Standard I/O Library – Open/Close
#include <stdio.h>
int fclose(FILE *fp);
– Flush buffered output
– Discard buffered input
– All I/O streams are closed after the process exits.
• setbuf or setvbuf to change the buffering of a file before any
operation on the stream.
Multi-byte Files
• Standard I/O file streams can be used with single byte and
multiple byte character sets.
#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp, int mode);
– Mode:
• Negative: set byte-oriented
• Positive: set wide-oriented
• 0: No change on orientation.
– Return values:
• Positive: wide oriented
• Negative: byte oriented
• 0: no orientation.
Standard I/O Library –
Reading/Writing
• Unformatted I/O
– Character-at-a-time I/O, e.g., getc()
• Buffering handled by standard I/O lib
– Line-at-a-time I/O, e.g., fgets()
• Buffer limit might need to be specified.
– Direct I/O, e.g., fread()
• Read/write a number of objects of a specified size.
• An ANSI C term, e.g., = object-at-a-time I/O
Standard I/O Library – Reading/Writing
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
– return next character if okay, EOF on end of file or error
– getchar == getc(stdin)
– Differences between getc and fgetc
• getc could be a macro
• Argument’s side effect (e.g., getc(f*++) will fail, exec time, passing of the
function address.
– unsigned char converted to int in returning
Standard I/O Library – Reading/Writing
#include <stdio.h>
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
– An error flag and an EOF flag for each FILE
int ungetc(int c, FILE *fp);
– Return c if OK, EOF on error
– No pushing back of EOF (i.e., -1)
• No need to be the same char read!
Standard I/O Library – Reading/Writing
#include <stdio.h>
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
– Return c if ok, EOF on error
– putchar(c) == putc(c, stdout)
– Differences between putc and fputc
• putc() can be a macro.
Line-at-a-Time I/O
#include <stdio.h>
char *fgets(char *buf, int n, FILE *fp);
– Include ‘\n’ and be terminated by null
– Could return a partial line if the line is too long.
– Return buf if OK, NULL on end of file or error
char *gets(char *buf);
–
–
–
–
Read from stdin.
No buffer size is specified  overflow
*buf does not include ‘\n’ and is terminated by null.
Return buf if OK, NULL on end of file or error
Line-at-a-Time I/O
#include <stdio.h>
char *fputs(const char *str, FILE *fp);
– *str is a null-terminated string
– No need for line-at-a-time output.
– Return non-negative value if OK, EOF on error
char *puts(const char *str);
– *str is a null-terminated string
– puts then writes ‘\n’ to stdout.
– Return non-negative value if OK, EOF on error
Standard I/O Efficiency
(98.5 MB & 3M lines)
• Program 5.1 – Page 143
– Copy stdin to stdout: getc  putc
• Program 5.2 – Page 144
– Copy stdin to stdout: fgets  fputs
User CPU
(seconds)
System CPU
(seconds)
Clock Time
(seconds)
8K BUFSIZE read()
0.01
0.18
6.67
fgets, fputs
2.59
0.19
7.15
139
getc, putc
10.84
0.27
12.07
120
fgetc, fputc
10.44
0.27
11.42
120
1B BUFSIZE read()
124.89
161.65
288.64
Function
Bytes of
program text
Binary I/O
• Objectives
– Read/write a structure at a time, which could contains null or ‘\n’.
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);
– Return than the specified number of objects  error or EOF 
ferror, feof
– Write error if less than the specified number of objects are written.
Binary I/O
• Example 1
float data[10];
if (fwrite(&data[2], sizeof(float), 4, fp) != 4)
err_sys(“fwrite error”);
• Example 2
struct {
short count;
long total;
char name[NAMESIZE];
} item;
if (fwrite(&item, sizeof(item), 1, fp) != 1)
err_sys(“fwrite error”);
Binary I/O
•
Not portable for programs using fread and fwrite
1. The offset of a member in a structure can differ between
compilers and systems (due to alignment).
2. The binary formats for various data types, such as
integers, could be different over different machines.
Positioning-a-Stream
#include <stdio.h>
long ftell(FILE *fp);
int fseek(FILE *fp, long offset, int whence);
void rewind(FILE *fp);
– Assumption: a file’s position can be stored in a long (since Version 7)
– whence: same as lseek
• Binary files: No requirements for SEEK_END under ANSI C (good under
Unix, possible padding for other systems).
• Text files: SEEK_SET only – 0 or returned value by ftell (different formats
for some sys).
Positioning-a-Stream
#include <stdio.h>
long fgetpos(FILE *fp, fpos_t *pos);
int fsetpos(FILE *fp, const fpos_t *pos);
– ANSI C standard
– Good for non-Unix systems
– A new data type fpos_t
Formatted I/O – Output
#include <stdio.h>
int printf(const char *format, …);
int fprintf(FILE *fp, const char *format, …);
int sprintf(char *buf, const char *format, …);
– Overflow is possible for sprintf() – ‘\0’ appended at the end of the
string.
int vprintf(const char *format, var_list arg);
int vfprintf(FILE *fp, const char *format, var_list arg);
int vsprintf(char *buf, const char *format, var_list arg);
Formatted I/O – Input
#include <stdio.h>
int scanf(const char *format, …);
int fscanf(FILE *fp, const char *format, …);
int sscanf(char *buf, const char *format, …);
Implementation Details
#include <stdio.h>
int fileno(FILE *fp);
– Get filedes for fcntl, dup, etc
– See <stdio.h> for per-stream flags, etc.
• Program 5.3 – Page 154
–
–
–
–
Printing buffering for various I/O streams
stdin, stdout – line-buffered, buf size
stderr – unbuffered, buf size
files: fully-buffered, buf size
Temporary Files
#include <stdio.h>
char *tmpnam(char *ptr);
– TMP_MAX in <stdio.h> /* = 25, ANSI C */
– If ptr == null, the pointer to the pathname is returned
(L_tmpnam # of bytes assumed if ptr != null).
FILE *tmpfile(void);
– wb+ an empty binary file.
– Unlink the file immediately after it is open!
• Program 5.4 – Page 156
– tmpnam and tmpfile
Temporary Files
#include <stdio.h>
char *tempnam(const char *directory, const char *prefix);
–
–
–
–
–
–
TMPDIR
*directory is null?
P_tmpdir in <stdio.h>
/tmp
/* prefix could be up to 5 chars */
Not POSIX.1 and ANSI C, but XPG3 (SVR4, 4.3+BSD)
• Program 5.5 – Page 157
– tempnam
Alternatives to Standard I/O
• Main Issue
– Too many data copyings
• kernel  standard I/O buffer
• standard I/O buffer  our buffer
• Alternatives
– Fast I/O Library (fio) – pointer
– sfio
• Represent files/memory regions under I/O streams, and stack
processing modules above I/O streams.
– mmap