This chapter introduces file input/output operations, as provided on systems that do not provide virtual memory services. The chapter discusses the improved input/output method provided by the virtual memory facilities and describes in "Using File and Record Locking " the older method of file and record locking.
Files and I/O Interfaces
Files that are organized as a sequence of data are called regular files. They can contain ASCII text, text in some other binary data encoding, executable code, or any combination of text, data, and code.
A regular file is made up of the following components:
Control data, called the inode. This data includes the file type, the access permissions, the owner, the file size, and the location of the data blocks.
File contents: a nonterminated sequence of bytes.
The Solaris operating environment provides the following basic forms of file input/output interfaces:
The traditional, raw style of file I/O is described in"Basic File I/O".
The standard I/O buffering provides an easier interface and improved efficiency to an application run on a system without virtual memory. In an application running in a virtual memory environment, such as on the SunOS operating system, standard file I/O is outdated.
The memory mapping interface is described in "Memory Management Interfaces". Mapping files is the most efficient and powerful form of file I/O for most applications run under the SunOS platform.
Basic File I/O
Table 4-1 Basic File I/O Interfaces
|open(2)||Open a file for reading or writing|
|close(2)||Close a file descriptor|
|read(2)||Read from a file|
|write(2)||Write to a file|
|creat(2)||Create a new file or rewrite an existing one|
|unlink(2)||Remove a directory entry|
|lseek(2)||Move read/write file pointer|
The following code sample demonstrates the use of the basic file I/O interface. read(2) and write(2) both transfer no more than the specified number of bytes, starting at the current offset into the file. The number of bytes actually transferred is returned. The end of a file is indicated on a read(2) by a return value of zero.
Example 4-1 Basic File I/O Interface
Always call close(2) for a file when you are done reading or writing it. Never call close(2) for a file descriptor that was not returned from a call to open(2).
File pointer offsets into an open file are changed by using read(2), write(2), or by calls to lseek(2). Some examples of using lseek(2) are:
off_t start, n; struct record rec; /* record current offset in start */ start = lseek (fd, 0L, SEEK_CUR); /* go back to start */ n = lseek (fd, -start, SEEK_SET); read (fd, &rec, sizeof (rec)); /* rewrite previous record */ n = lseek (fd, -sizeof (rec), SEEK_CUR); write (fd, (char *&rec, sizeof (rec));
Advanced File I/O
Table 4-2 Advanced File I/O Interfaces
|link(2)||Link to a file|
|access(2)||Determine accessibility of a file|
|mknod(2)||Make a special or ordinary file|
|chmod(2)||Change mode of file|
|chown(2), lchown(2), fchown(2)||Change owner and group of a file|
|utime(2)||Set file access and modification times|
|stat(2), lstat(2), fstat(2)||Get file status|
|fcntl(2)||Perform file control functions|
|fpathconf(2)||Get configurable path name variables|
|opendir(3C), readdir(3C), closedir(3C)||Perform directory operations|
|mkdir(2)||Make a directory|
|readlink(2)||Read the value of a symbolic link|
|rename(2)||Change the name of a file|
|rmdir(2)||Remove a directory|
|symlink(2)||Make a symbolic link to a file|
File System Control
Table 4-3 File System Control Interfaces
|ustat(2)||Get file system statistics|
|sync(2)||Update super block|
|mount(2)||Mount a file system|
|statvfs(2), fstatvfs(2)||Get file system information|
|sysfs(2)||Get file system type information|