Signals - PowerPoint PPT Presentation

About This Presentation
Title:

Signals

Description:

fseek(stream, 4, SEEK_SET) Seek four bytes after the beginning of the file. ... fseek(stream, 16, SEEK_CUR) Seek sixteen bytes ahead of the current position. ... – PowerPoint PPT presentation

Number of Views:48
Avg rating:3.0/5.0
Slides: 56
Provided by: Alej202
Category:
Tags: fseek | signals

less

Transcript and Presenter's Notes

Title: Signals


1
CS 241 Section Week 8(10/29/09)
2
Outline
  • MP5 Overview
  • Files I/O
  • UNIX File Systems
  • inodes
  • Directories
  • Links

3
MP5 Overview
4
MP5 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.

5
Files and I/O
6
Unix File Structure
/ /bin/ /home/ /home/someuser/
/home/someuser/somefile.txt /usr/
/usr/bin/ /usr/lib/
7
Internal File Structure
  • A file is just a series of bytes

T
h
i
s
w
n
i
x
f
i
l
e
.
8
Internal 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
9
I/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
10
I/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
11
Buffered 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.

12
File 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

13
open()
  • 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.

14
open()
  • 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)

15
fopen()
  • FILE fopen( const char filename,
    const char mode)
  • Rather than an int (file descriptor), fopen
    returns a FILE stream.

16
File 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.

17
File Permissions
  • These permissions are stored as a
    three-octal-digit number (000 to 777).

7
5
5
18
File Permissions
  • The most-significant number is the owners
    permission.

Owner
7
5
5
19
File Permissions
  • The middle number is the groups permission.

Group
7
5
5
20
File Permissions
  • The least-significant number is everyone elses
    permission.

Other
7
5
5
21
File 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
22
File 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

23
Other 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.

24
Other 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.

25
Buffered 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.

26
Other 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.

27
Other 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.

28
UNIX File Systems
29
UNIX 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
30
UNIX File Systems
inode (continued) Storing Large Files
31
Directories are files too!
  • Directories, like files, have inodes with
    attributes and pointers to disk blocks

32
Directories 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.

33
Directories 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.

34
Directory functions
include ltunistd.hgt Change the directory int
chdir(const char path) Get the current working
directory char getcwd(char buf, size_t size)
35
Directory 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)
36
Whats 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)
37
Example 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!!

38
Example 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!!

39
More 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)
40
Warning! Warning!
opendir and readdir are NOT thread-safe. DO
NOT open two directories at the same time!
41
How 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
    '..'

42
File 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)
43
Useful 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

44
Example 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

45
include 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)
46
Links
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
47
Link 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
48
Hard 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")
49
Hard Link Example (contd)
Q What happens if /dirA/name1 is deleted and
recreated?
50
Hard Link Example (contd)
A /dirA/name1 and /dirB/name2 are now two
distinct files.
51
Symbolic 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
52
Soft 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")
53
Soft Link Example (contd)
Q What happens if /dirA/name1 to is deleted and
recreated?
54
Soft Link Example (contd)
A /dirA/name1 has a different inode, but
/dir/name2 still links to it.
55
Link 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.
Write a Comment
User Comments (0)
About PowerShow.com