Title: Signals
1CS 241 Section Week 8(10/29/09)
2Outline
- MP5 Overview
- Files I/O
- UNIX File Systems
- inodes
- Directories
- Links
3MP5 Overview
4MP5 Overview
- You are to create a deadlock resilient
semaphore library. You should implement six
functions. - Since we only allow one instance of each
resource, you do not need to implement the
Bankers algorithm for deadlock prevention. You
may use a resource allocation graph instead. - In deadlock detection mode, once a deadlock is
detected, you need only send a SIGINT signal. The
library does NOT need to worry about how SIGINT
is handled. - The given test cases are far from complete. You
should derive your own test cases.
5Files and I/O
6Unix File Structure
/ /bin/ /home/ /home/someuser/
/home/someuser/somefile.txt /usr/
/usr/bin/ /usr/lib/
7Internal File Structure
- A file is just a series of bytes
T
h
i
s
w
n
i
x
f
i
l
e
.
8Internal File Structure
- A file is just a series of bytes
T
h
i
s
w
n
i
x
f
i
l
e
.
Start of File
End of File
Current Offset
9I/O Libraries in C
stdio fopen, fread, fwrite, fclose,
... (buffered I/O)
User Process
open, read, write, close, select, poll,
... (direct to kernel I/O)
kernel system call handler
Kernel
file I/O
terminal I/O
pipe I/O
network I/O
audio I/O
10I/O Libraries in C
stdio fopen, fread, fwrite, fclose,
... (buffered I/O)
User Process
open, read, write, close, select, poll,
... (direct to kernel I/O)
kernel system call handler
Kernel
file I/O
terminal I/O
pipe I/O
network I/O
audio I/O
11Buffered I/O Advantages
- Weve previously used
- printf()
- fprintf()
- Why use buffers?
- I/O operations are SLOW!
- Every time you write just one byte, you dont
want to have to access your hard drive.
12File Descriptors
- The UNIX operating system uses a file descriptor
table to store information about open files
0
stdin
(sof, eof, offset values, etc)
1
stdout
2
stderr
36
/usr/home/myfile.txt
13open()
- int open(const char pathname, int
flags) - returns an int, which is the file descriptor
- takes in either a relative or full path name
- various flag options allow a file to only be
appended to (O_APPEND), opened as write only
(O_WRONLY), and more.
14open()
- To open a file for reading
- int ifd open(./input.txt, O_RDONLY)
- To open OR create a file for writing, with given
permissions - int ofd open(output.txt,
O_WRONLY O_CREAT, S_IRUSR
S_IWUSR)
15fopen()
- FILE fopen( const char filename,
const char mode) - Rather than an int (file descriptor), fopen
returns a FILE stream.
16File Permissions
- In UNIX, the file permissions system is
relatively basic. - Each file has a single owner and a single group
associated with it. - Each file also has permissions associated with
itself for the owner, members of the group the
file is in, and for everyone else.
17File Permissions
- These permissions are stored as a
three-octal-digit number (000 to 777).
7
5
5
18File Permissions
- The most-significant number is the owners
permission.
Owner
7
5
5
19File Permissions
- The middle number is the groups permission.
Group
7
5
5
20File Permissions
- The least-significant number is everyone elses
permission.
Other
7
5
5
21File Permissions
- Each octal number is simply three bits a read
bit, a write bit, and an execute bit.
7
5
5
Read
1
1
1
Write
1
0
0
Execute
1
1
1
22File Permissions
- Thus
- 755 means everyone can read and execute by file,
but only the owner can write to (edit) my file - 644 means everyone can read my file, only the
owner can write to my file, and no one can
execute it - 660 means only members of the files group and
the files owner may read or edit the file
others cannot even read it
23Other C file commands!
- close(int fd)
- Close the file associated with the given file
descriptor number. - Can you close stdout? Try it.
- fclose(FILE stream)
- fclose can close stdout.
24Other C file commands!
- ssize_t read(int fd, void buf,
size_t count) - Read up to count bytes from a file descriptor
into the buffer buf. - ssize_t write(int fd, void buf,
size_t count) - Write count bytes to a file descriptor from the
buffer buf.
25Buffered I/O versions
- size_t fread(void ptr, size_t size,
size_t count, FILE
stream) - Read up to countsize bytes from a file
descriptor into the buffer ptr. - size_t fwrite(void ptr, size_t size,
size_t count, FILE
stream) - Write countsize bytes to a file descriptor from
the buffer ptr.
26Other C file commands!
- off_t lseek(int fd, off_t offset,
int whence) - Seek to a different point in the file.
- lseek(fd, 4, SEEK_SET)
- Seek four bytes after the beginning of the file.
- lseek(fd, -4, SEEK_END)
- Seek four bytes before the end of the file.
- lseek(fd, 16, SEEK_CUR)
- Seek sixteen bytes ahead of the current position.
27Other C file commands!
- int fseek(FILE stream, long int
offset, int origin)
- fseek(stream, 4, SEEK_SET)
- Seek four bytes after the beginning of the file.
- fseek(stream, -4, SEEK_END)
- Seek four bytes before the end of the file.
- fseek(stream, 16, SEEK_CUR)
- Seek sixteen bytes ahead of the current position.
28UNIX File Systems
29UNIX File Systems
inode per-file data structure Advantage Efficient
for small files Flexible if the size
changes Disadvantage File must fit in a single
disk partition
30UNIX File Systems
inode (continued) Storing Large Files
31Directories are files too!
- Directories, like files, have inodes with
attributes and pointers to disk blocks
32Directories are files too!
- Directories, like files, have inodes with
attributes and pointers to disk blocks - Each directory contains the name and i-node for
each file in the directory.
33Directories are files too!
- Directories, like files, have inodes with
attributes and pointers to disk blocks - Each directory contains the name and i-node for
each file in the directory.
34Directory functions
include ltunistd.hgt Change the directory int
chdir(const char path) Get the current working
directory char getcwd(char buf, size_t size)
35Directory reading functions
include ltdirent.hgt Open the directory DIR
opendir(const char dirname) Close the
directory int closedir(DIR dirp) Read the
directory struct dirent readdir(DIR dirp)
36Whats in a directory entry?
struct dirent Member Fields char
d_name256 Null-terminated file name ino_t
d_ino inode number unsigned char
d_reclen Length of this record unsigned char
d_type Type of file (DT_REG, DT_DIR,
DT_FIFO, DT_SOCK, DT_CHR,
DT_BLK, DT_UNKNOWN)
37Example 1
- Use opendir and readdir to print all the
filenames in the current directory - include ltdirent.hgt
-
- DIR dir
- struct dirent entry
- dir opendir(.)
- while(entry readdir(dir))
- printf(s\n,entry-gtd_name)
-
- closedir(dir)
- Remember to include error checking!!
38Example 2
- Modify Example 1 to use the member fields of
struct dirent to display the inode for each file,
as well as whether the file is a directory or a
regular file. - include ltdirent.hgt
-
- DIR dir
- struct dirent entry
- dir opendir(.)
- while(entry readdir(dir))
- printf(s lu\n,entry-gtd_name, entry-gtd_ino)
- if(entry-gtd_type DT_DIR)
- printf(Directory )
- else if(entry-gtd_type DT_REG)
- printf(File )
-
- closedir(dir)
- Remember to include error checking!!
39More Directory Functions
include ltdirent.hgt Set the position of next
readdir void seekdir(DIR dir, off_t
offset) Set the position back to the start of
the directory void rewinddir(DIR dirp) Get the
current location of directory stream off_t
telldir (DIR dir)
40Warning! Warning!
opendir and readdir are NOT thread-safe. DO
NOT open two directories at the same time!
41How to recursively traverse a directory tree
- Open the directory (opendir)
- Read each entry (readdir)
- If the file is a directory (d_type DT_DIR),
store it (e.g. in an array of strings). - Close the directory (closedir)
- Traverse each saved subdirectory, EXCEPT '.' and
'..'
42File information stat
Use the stat functions to view the files inodes
attributes. include ltsys/stat.hgt include
ltsys/types.hgt include ltunistd.hgt For a
file int stat(const char restrict path, struct
stat restrict buf) For a link int lstat(const
char restrict path, struct stat restrict
buf) For a file descriptor int fstat(int
fildes, struct stat buf)
43Useful fields and macros in struct stat
- stat.st_size
- File size, in bytes
- stat.st_mode
- File type
- S_ISDIR(stat.st_mode)
- Is this a directory?
- User permissions
- Etc.
- stat.st_mtime
- Time of last modification
44Example 3
- Modify Example 2 to also give file information
about each file. - How large is each file?
- Which files are world-readable?
- Which files have been modified in the last 24
hours? - Hint man 2 stat
45include ltstdio.hgt include ltdirent.hgt include
lttime.hgt include ltsys/types.hgt include
ltsys/stat.hgt include ltunistd.hgt include
lterrno.hgt int main(int argc, char argv)
DIR dir struct dirent entry time_t now
time(NULL) if((dir opendir(".")) NULL)
perror("Can't open directory")
exit(-1) while((entry readdir(dir)) !
NULL) struct stat status
if(entry-gtd_type DT_DIR)
printf("Directory ") else printf("File
") printf("s is at inode d\n",
entry-gtd_name, entry-gtd_ino)
if(stat(entry-gtd_name, status))
perror("\tCan't get stat info") continue
printf("\t d bytes, ",
status.st_size) if(status.st_mode
S_IROTH) printf("World-readable, ")
if(difftime(now,status.st_mtime)lt86400)
printf("Recently updated, ")
closedir(dir)
46Links
Hard Link Directory Entry e.g. all regular
files Symbolic Link Also called a Soft Link A
special file that serves as a reference to
another file
47Link Functions
include ltunistd.hgt To create a new link int
link(const char oldpath, const char
newpath) Same as ln To remove an entry from
the directory int unlink(const char
path) Same as rm Returns 0 if successful, -1
with errno set if unsuccessful
48Hard Link Example
Command Line ln /dirA/name1 /dirB/name2 C Code
Segments if (link("/dirA/name1", "/dirB/name2")
-1) perror("Failed to make a new link in
/dirB")
49Hard Link Example (contd)
Q What happens if /dirA/name1 is deleted and
recreated?
50Hard Link Example (contd)
A /dirA/name1 and /dirB/name2 are now two
distinct files.
51Symbolic Link Function
include ltunistd.hgt To create a symbolic
link int symlink(const char oldpath, const
char newpath) Same function as command ln
s Returns 0 if successful, -1 with errno set if
unsuccessful
52Soft Link Example
Command Line ln s /dirA/name1 /dirB/name2 C
Code Segments if (symlink("/dirA/name1",
"/dirB/name2") -1) perror("Failed to create
a symbolic link in /dirB")
53Soft Link Example (contd)
Q What happens if /dirA/name1 to is deleted and
recreated?
54Soft Link Example (contd)
A /dirA/name1 has a different inode, but
/dir/name2 still links to it.
55Link number
- The link number (the st_nlink field in stat)
tells how many directory entries link to this
inode. The link number is - Set to 1 when a file is created
- Incremented when link is called
- Decremented when unlink is called
- The link number appears in the second column of
the output of ls l. Try it! - The link number only counts hard links, not soft
links.