The File
In this chapter we will look at the fundamental
primitives UNIX provides for handling files from
within programs.
WebDatabase Lab
IN319(Summer 2012)
Filesystem
Method for storing and organizing computer files a
nd the data.
Make it easy to find and access files.
File systems may use a data storage device
hard disk, CD-ROM
IN319(Summer 2012)
user
level
kernel
level
User
app
User
app
User
app
trap
open
create
close
read
write
lseek
unlink
remove
fcntl
buffer cache
character
block
device driver
Hardware Control
H/W
level
IN319(Summer 2012)
Hardware
IN319(Summer 2012)
UNIX primitives
Name
Description
open
create
close
read
write
lseek
unlink
remove
fcntl
This functions are not part of ANSI C, but are part of POSIX.1 and XPG3
The functions described in this chapter are often referred to as unbuffered I/O.
Unbuffered I/O is provided by the functions open, read, write, lseek, and
close. These functions all work with file descriptors.
IN319(Summer 2012)
File Descriptor
File Descriptor
In the kernel, all open files are referred to by
file descriptors.
Non negative integer (the lowest unused integer)
When we open an exiting file or create a new file, k
ernel returns a file descriptor to the process.
Argument to either read or write.
Each process created by a Unix shell begins life with
three open files associated with a terminal:
File descriptor
IN319(Summer 2012)
Symbolic constant
describe
STDIN_FILENO
Standard input
STDOUT_FILENO
Standard output
STDERR_FILENO
Standard error
IN319(Summer 2012)
Std in
[1]
Std out
[2]
Std err
[3]
data
Why three flags? Cant we scrap O_RDWR and just use O_RDONLY | O_WRONLY?
No, because implementation have always defined O_RDONLY as 0.
O_RDONLY | O_WRONLY == O_WRONLY
IN319(Summer 2012)
/* exit() */
/* open() */
10
File permissions
[ce:/home1/gildong/unix2]% ls -al test
-rw-r--r-1 gildong student
3007 12 3
[ce:/home1/gildong/unix2]% chmod g+w test
[ce:/home1/gildong/unix2]% ls -al test
writestudent
-rw-rw-r-1g roup
gildong
3007 12
3
!
15:30 test
15:30 test
-rwxrw-r-- owner
1 gildong
student
3007 12 3 15:30 test*
!
[ce:/home1/gildong/unix2]%
7
6
4
111 110 100
rwx rw- r- -
IN319(Summer 2012)
11
Description
S_IRUSR
S_IWUSR
S_IXUSR
S_IRWXU
S_IRGRP
S_IWGRP
S_IXGRP
S_IRWXG
S_IROTH
S_IWOTH
S_IXOTH
S_IRWXO
S_ISUID
S_ISGID
read by owner
write by owner
execute by owner
read, write, execute by owner
read by group
write by group
execute by group
read, write, execute by group
read by others
int fd;
write by others
mode_t fdmode = ( S_IRUSR |
execute by others
S_IWUSR |
S_IRGRP |
read, write, execute by others
S_IROTH );
set user ID on execution
set group ID on execution
fd = open(file, O_RDWR | O_CREAT, fdmode);
IN319(Summer 2012)
12
13
IN319(Summer 2012)
14
fd = open(/tmp/newfile, O_RDONLY);
.
.
.
fd = close(fd);
IN319(Summer 2012)
15
16
*/
n1 : 512, f_offset : 512 */
n2 : 188, f_offset : 700 */
n3 : 0, when read EOF */
Std in
File Table
[1]
Std out
count
[2]
Std err
[3]
fd
File
O_RDONLY
file size
700byte
file offset
3
kernel area
17
18
example p.20(29)
19
BUFSIZE
1
64
512
4096
8192
Real time
User time
System time
0:24.49
0:0.46
0:0.12
0:0.07
0:0.07
0:3.13
0:0.12
0:0.02
0:0.00
0:0.01
0:21.16
0:0.33
0:0.08
0:0.05
0:0.05
20
IN319(Summer 2012)
21
user
level
ps2
ls
shell
trap
kernel
level
Process
Management
scheduler
buffer cache
IPC
character
block
memory management
device driver
Hardware Control
H/W
level
IN319(Summer 2012)
Hardware
22
Arguments
filedes : file descriptor ( obtained from open or creat)
if refer to a pipe, FIFO or socket, sets errno to ESPIPE(return -1)
offset
: number of bytes from start_flag
a
start_flag : starting position
SEEK_SET
SEEK_CUR
SEEK_END
IN319(Summer 2012)
#0
#1
#2
c
d
23
SEEK_SET
SEEK_CUR
SEEK_END
IN319(Summer 2012)
24
25
4k
4k
4k
4k
4k
4k
4k
4k
file.hole
IN319(Summer 2012)
26
The kernel maintains a file table for all open files. Each fil
e table entry contains
The file status flags for the file(read, write )
The current file offset
A pointer to the v-node table entry for the file
Each open file (or device) has a v-node structure that con
tains information about the type of file and pointers to fun
ctions that operate on the file.
IN319(Summer 2012)
27
a.out
IN319(Summer 2012)
28
/* fd = open(test, O_RDONLY); */
$ ./b.out
/* fd = open(test, O_RDONLY); */
v-node: Fundamental abstraction
representing a file in the kernel
a.out
b.out
IN319(Summer 2012)
29
char buf[20];
close(fd3);
close(fd4);
process
entry
fd tablefile
flag pointer
fd 0:
file table
v-node table
status
O_RDWR
v-node info
count
I-node info
offset
0
20
v-node ptr
fd 1:
file table
fd 2
fd 3
fd 4:
status
O_RDONLY
count
offset
0
30
v-node ptr
IN319(Summer 2012)
IN319(Summer 2012)
31
Example : dup2(2)
fd4 = open(test, O_RDONLY); /* fd4 == 4
dup2(3, fd4);
*/
==
close(fd4);
fcntl(3, F_DUPFD, fd4)
file table
process table entry
fd
flag
file
pointer
fd 0:
status
v-node table
O_RDWR
count
1 2
offset
v-node info
I-node info
current file size
v-node ptr
fd 1:
fd 2:
tests file table
fd 4:
status
O_RDONLY
v-node table
count
fd 3:
v-node info
offset
I-node info
v-node ptr
IN319(Summer 2012)
32
33
34
status flags
O_APPEND
O_DSYNC
O_NONBLOCK
O_RSYNC
O_SYNC
O_ACCMODE
O_RDONLY
O_RDWR
O_WRONLY
WebDatabase Lab, Inha Univ
IN319(Summer 2012)
35
Redirection (1/3)
process table entry
$ prog_name
fd
flag
file
pointer
standard input
fd 0:
prog_name
file table
fd 1:
/dev/fd/0s v-node
fd 2:
fd 3:
prog_name
fd 0:
infile
fd 1:
file
pointer
/dev/fd/0s filetable
file table
file status flags
current file offset
v-node ptr
fd 2:
infiles v-node
IN319(Summer 2012)
36
fd 3:
Redirection (2/3)
process table entry
$ prog_name
fd
flag
file
pointer
standard
output
fd 0:
prog_name
file table
fd 1:
/dev/fd/1s v-node
fd 2:
fd 3:
dup2(outfile, 1);
process table entry
fd
flag
prog_name
fd 0:
outfile
fd 1:
file
pointer
/* outfile */
/dev/fd/1s filetable
file table
file status flags
current file offset
v-node ptr
fd 2:
outfiles v-node
IN319(Summer 2012)
37
fd 3:
Redirection (3/3)
prog_name < infile > outfile
IN319(Summer 2012)
38
io example p.30(42)
$io
This is line
This is line
This is line
This is line
<Ctrl-D>
$
#include <stdlib.h>
#include <unistd.h>
#define SIZE 512
main()
{
size_t nread;
char buf[SIZE];
1
1
2
2
IN319(Summer 2012)
39
IN319(Summer 2012)
40
Standard I/O
automatic buffering
more programmer-friendly interface
This makes the library easy to use
absolve the programmer from worrying about effici
ency
IN319(Summer 2012)
41
main()
{
FILE *stream;
if ( ( stream = fopen ("junk", "r")) == NULL)
{
printf ("Could not open file junk\n");
exit (1);
}
}
IN319(Summer 2012)
42
IN319(Summer 2012)
43
fopen(3)
#include <stdio.h>
FILE *fopen(const char *restrict pathname,
const char *restrict type);
All three return: file pointer if OK, NULL on error
Arguments
type:
r or rb
w or wb
a or ab
IN319(Summer 2012)
44
getc(3), putc(3)
#include <stdio.h>
int getc(FILE *istream);
Return: next character if OK, EOF on end of file or error
int putc(int c, FILE *ostream);
Return: c if OK, EOF on error
int c;
FILE *istream, *ostream;
/* istream , ostream . */
.
.
.
while( ( c=getc(istream)) !=EOF) //EOF defined in <stdio.h>, -1
putc(c, ostream);
IN319(Summer 2012)
45
Buffering
Standard I/O avoid this inefficiency by an elegan
t buffering mechanism.
The buffer used is usually obtained by one of the
standard I/O functions calling malloc the first ti
me I/O is performed on a stream.
Application
Standard I/O Library
user()
buffering mechanism
main()
user
level
System Call Interface
IN319(Summer 2012)
46
kernel
level
WebDatabase Lab, Inha Univ
#include <stdio.h>
#include <stdlib.h>
int notfound (const char *progname, const char *filename)
{
fprintf (stderr, "%s: file %s not found\n", progname, filename);
exit (1);
}
IN319(Summer 2012)
47
IN319(Summer 2012)
48
49
/* err1.c . */
//errno is defined
main()
{
int fd;
if ( (fd = open ("nonesuch", O_RDONLY)) == -1)
fprintf(stderr, "ENOENT: %s\n", strerror(errno));
errno = EACESS;
perror(argv[0]);
}
ENOENT: No such file or directory
a.out: Permission denied
IN319(Summer 2012)
50
error 2
error 2
IN319(Summer 2012)
51
IN319(Summer 2012)
52