组织为一系列数据的文件称为常规文件。常规文件可以包含 ASCII 文本、以某些其他二进制数据编码的文本、可执行代码,或者文本、数据以及代码的任意组合。
常规文件由以下部分构成:
称为 inode 的控制数据。此数据包括文件类型、访问权限、属主、文件大小以及数据块的位置。
文件内容:非结束符号的字节序列。
Solaris 操作系统提供了以下基本的文件输入/输出接口形式:
基本文件 I/O中介绍了传统的原始文件 I/O 样式。
标准 I/O 缓冲为没有虚拟内存的系统上运行的应用程序提供了更简便的接口以及更高的效率。在虚拟内存环境中(例如在 SunOS 操作系统上)运行的应用程序中,标准文件 I/O 已过时。
内存管理接口中介绍了内存映射接口。对于在 SunOS 平台运行的大多数应用程序而言,映射文件是最有效的文件 I/O 形式。
表 6-1 基本文件 I/O 接口
|
以下代码样例说明了基本文件 I/O 接口的用法。read(2) 和 write(2) 都从文件当前偏移位置开始传送不超过指定数量的字节。返回实际传送的字节数。read(2) 返回值零时指示已到达文件结尾。
示例 6-1 基本文件 I/O 接口
#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); }
完成文件读取或写入后,应始终调用 close(2)。对于不是从 open(2) 调用返回的文件描述符,请不要调用 close(2)。
可使用 read(2)、write(2) 或通过调用 lseek(2) 来更改已打开文件的文件指针偏移。以下示例说明了 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));
表 6-2 高级文件 I/O 接口
|
表 6-3 文件系统控制接口
|