Advanced UNIX progamming Fall 2002 Instructor: Ashok Srinivasan Lecture 7 Acknowledgements: The syllabus and power point presentations are modified versions of those by T. Baker and X. Yuan Announcements • Reading assignment – APUE Chapter 3 • Pages 47-56, 56-62 – APUE Chapter 5 • Section 5.4 is particularly important – APUE Chapter 7 • Section 7.3 is important • You should know the material from 7.1, 7.2, 7.4 – 7.9 from previous courses and classes – APUE Chapter 8 • Sections 8.1-8.3, 8.5-8.6, 8.9-8.10 • You should also understand the idea behind race conditions Review • UNIX file system – File system abstraction – Directories – File descriptors Week 3 Topics • UNIX file system – File system abstraction – Directories – File descriptors • Unix API Programming Examples and Techniques – Example with direct IO • open, close, fdopen, lseek, unlink – Variable argument list • HW1 hints Week 3 Topics ... continued • File I/O – File descriptors • open, creat, close, dup, dup2 – I/O redirection • Process management – fork, exit, wait, waitpid, execv • Pipes – Named and unnamed pipes – Implementing pipe in a shell UNIX file system • File system abstraction • Directories • File descriptors File Descriptors ... review File Descriptors ... continued • The POSIX standard defines the following – File descriptor: A per-process, unique, nonnegative integer used to identify an open file for the purposes of file access – Open file description: A record of how a process or group of processes are currently accessing a file • Each file descriptor refers to exactly one open file description, but an open file description may be referred to by more than one file descriptor • A file offset, file status, and file access modes are attributes of an open file description – File access modes: Specification of whether the file can be read and written File Descriptors ... continued – File offset: The byte position in the file where the next I/O operation through that open file description begins • Each open file description associated with a regular file, block special file, or directory has a file offset • There is no file offset specified for a pipe or FIFO (described later) – File status: Includes the following information • append mode or not • blocking/nonblocking • Etc File Descriptors ... continued – FIFO special file: A type of file with the property that data written to such a file is read on a first-infirst-out basis – Pipe: An object accessed by one of the pair of file descriptors created by the pipe() function • Once created, the file descriptors can be used to manipulate the pipe, and it behaves identically to a FIFO special file when accessed this way • It has no name in the file hierarchy File Descriptors ... continued • Important points – A file descriptor does not describe a file • It is just a number that is ephemerally associated with a particular open file description – An open file description describes a past "open" operation on a file; its does not describe the file – The description of the file is in the inode • There may be several different open file descriptors (or none) referring at it any given time Unix API Programming Examples and Techniques • Examples with direct IO – open, close, fdopen, lseek, unlink • Variable argument list • Note: – Read the POSIX standard and sse man pages to get information on system calls – Look into the system header files • Example: /usr/include/sys/types.h Direct I/O • Using open() – The usual C-language stream-oriented I/O operations, like printf(), use buffers and process data character-by-character – They are implemented using the lower-level direct I/O operations read() and write() – In situations where we do not want to view the data as characters, or where we want greater efficiency, it is better to use the direct I/O operations Using man • Look at the man page for write() • If there is more than one page on a given name, man will give you the one that is first in the chapter order of the Unix manual. • Shell commands are in Section 1, I/O and OS interface calls are in Section 2 and Section 3 respectively – Specification of section number varies • On Red Hat Linux, type man 2 write or man -S 2 write to see the page on write from Section 2 of the Unix manual • On Solaris, you can type man -s 2 write man page for open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> • Solaris 2.6 includes the following synopsis – int open(const char *path, int oflag, /* mode_t mode */ ...); • Red Hat Linux 6.2 – int open(const char *pathname, int flags, mode_t mode); • 1996 POSIX standard synopsis is as follows – int open(const char *path, int oflag, ...); • The latest official POSIX/Unix synopsis – No <sys/types.h> What does the ... mean here? Will a compiler allow this in an actual program? Variable Argument Lists • The ... indicates a variable number of arguments – Similar to that in printf() – For more on variable argument lists, look at the file /usr/include/stdarg.h – Functions with variable argument lists can be dangerous • It is difficult to check types, and the use of a correct number of arguments Example Programs • example1.c illustrates a common programming error – Failure to provide the correct number of arguments to a vararg function • example2.c illustrates opening a file File I/O • File descriptors – open, creat, close, dup, dup2 • I/O redirection File descriptors • Implication of the file descriptor/open file descriptions/inode table organization in UNIX – open and creat • search for the first empty slot in the process file descriptor table • allocate an open file description in the file table, which has a pointer to the inode table • See example3.c – dup and dup2 • Duplicate the file descriptor in the process file descriptor table • See example3b.c • Where is the current file position stored? I/O redirection • All UNIX processes have three predefined files open – stdin -- STDIN_FILENO (0) – stdout -- STDOUT_FILENO (1) – stderr -- STDERR_FILENO (2) • We can redirect the I/O by manipulating these file descriptors • See example4.c and example5.c