Programming Interfaces Guide

Files and I/O Interfaces

Files that are organized as a sequence of data are called regular files. Regular files 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:

The Solaris operating system provides the following basic forms of file input/output interfaces:

Basic File I/O

The following interfaces perform basic operations on files and on character I/O devices.

Table 6–1 Basic File I/O Interfaces

Interface Name 

Purpose 

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 6–1 Basic File I/O Interface

#include			<fcntl.h>
#define			MAXSIZE			256

main()
{
    int     fd;
    ssize_t n;
    char	    array[MAXSIZE];

    fd = open ("/etc/motd", O_RDONLY);
    if (fd == -1) {
        perror ("open");
        exit (1);
    }
    while ((n = read (fd, array, MAXSIZE)) > 0)
        if (write (1, array, n) != n)
            perror ("write");
    if (n == -1)
        perror ("read");
    close (fd);
}

When you are done reading or writing a file, always call close(2). Do not 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). The following example demonstrates the uses of lseek.

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

The following table lists the tasks performed by advanced file I/O interfaces.

Table 6–2 Advanced File I/O Interfaces

Interface Name 

Purpose 

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 

ioctl(2)

Control device 

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

The file system control interfaces listed in the following table enable the control of various aspects of the file system.

Table 6–3 File System Control Interfaces

Interface Name 

Purpose 

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