Figure 5.1 (page 146): Tree structures of a file system.
Current Working Directory
#include <unistd.h> int chdir(const char *path); char *getcwd(char *buf, size_t size);Program 5.1, page 149, outputs the pathname of the current working directory. It uses PATH_MAX to determine the size of the buffer needed.
Program 5.2, page 150, determines the implementation's maximum pathname length relative to the root directory using pathconf.
#include <unistd.h> long fpathconf(int filedes, int name); long pathconf(const char *path, int name); long sysconf(int name);
Directory Access
#include <dirent.h> DIR *opendir(const char *filename); struct dirent *readdir(DIR *dirp); void rewinddir(DIR *dirp); int closedir(DIR *dirp);opendir provides a handle for the other functions.
Program 5.3 (page 153) lists the files in a directory.
Accessing file status information
#include <sys/stat.h> int lstat(const char *restrict path, struct stat *restrict buf); int stat(const char *restrict path, struct stat *restrict buf); int fstat(int fildes, struct stat *buf);stat is given the name of a file.
dev_t st_dev; /* device ID of device containing file */
ino_t st_ino; /* file serial number */
mode_t st_mode; /* file mode */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of file */
gid_t st_gid; /* group ID of file */
off_t st_size; /* file size in bytes (regular files) */
/* path size (symbolic links) */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last data modification */
time_t st_ctime; /* time of last file status change */
Example 5.8, printaccess, page 155, displays the time that a file
was last accessed.
Exercise 5.9, printaccessmodbad, page 156 shows an incorrect way of printing two times.
A correct solution is shown in prontaccessmod, page 156.
Use the following macros to test the st_mode field for the file type.
| S_ISBLK(m) | block special file |
| S_ISCHR(m) | character special file |
| S_ISDIR(m) | directory |
| S_ISFIFO(m) | pipe or FIFO special file |
| S_ISLNK(m) | symbolic link |
| S_ISREG(m) | regular file |
| S_ISSOCK(m) | socket |
Example 5.10, isdirectory, page 157, shows how to determine whether a file is a directory.
Figure 5.2 (page 159): Structure of a typical UNIX file system.
Inodes
A directory entry contains only a name and an index into a table
giving information about a file. The table and the index are both
referred to as an inode.
This is what an inode looks like:
Figure 5.3 (page 160): Schematic structure of a traditional UNIX inide.
Links
|
|
| Figure 5.4 (page 163): A directory entry, inode, and data block for a simple file. | Figure 5.5 (page 165): Two hard links to the same file as in Figure 5.4. |
|
|
| Figure 5.5 (page 165): Two hard links to the same file as in Figure 3.4. | Figure 5.6 (page 167): The situation after editing the file. The original file had inode 12345 and two hard links prior to being edited. |
|
|
| Figure 5.5 (page 165): Two hard links to the same file as in Figure 3.4. | Figure 5.7 (page 168): The situation after editing the file with an editor that makes a backup copy. |
How to do it right:
open("/dirA/name1");
read
close
modify memory image file file
open("/dirA/name1",O_WRONLY|O_TRUNC);
write
close
Symbolic Links
Figure 5.8 (page 170): An ordinary file with a symbolic link to it.
Figure 5.9 (page 171): The situation after editing a file that has a symbolic link.