编程接口指南

文件和 I/O 接口

组织为一系列数据的文件称为常规文件。常规文件可以包含 ASCII 文本、以其他二进制数据编码的文本、可执行代码,或者文本、数据以及代码的任意组合。

常规文件由以下部分构成:

Solaris 操作系统提供以下基本的文件输入/输出接口形式:

基本文件 I/O

以下接口针对文件和字符 I/O 设备执行基本操作。

表 5–1 基本文件 I/O 接口

接口名称 

目的 

open(2)

打开文件进行读取或写入 

close(2)

关闭文件描述符 

read(2)

从文件中读取 

write(2)

向文件中写入 

creat(2)

创建新文件或重写现有文件 

unlink(2)

删除目录项 

lseek(2)

移动读/写文件指针 

以下代码样例说明了基本文件 I/O 接口用法。read(2)write(2) 都从文件当前偏移位置开始传送不超过指定数量的字节。返回实际传送的字节数。read(2) 返回零时指示已到达文件结尾。


示例 5–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));

高级文件 I/O

下表列出了高级文件 I/O 接口所执行的任务。

表 5–2 高级文件 I/O 接口

接口名称 

目的 

link(2)

链接到文件 

access(2)

确定文件的可访问性 

mknod(2)

生成特殊文件或普通文件 

chmod(2)

更改文件的模式 

chown(2), lchown(2), fchown(2)

更改文件的属主和组 

utime(2)

设置文件的访问时间和修改时间 

stat(2), lstat(2), fstat(2)

获取文件状态 

fcntl(2)

执行文件控制功能 

ioctl(2)

控制设备 

fpathconf(2)

获取可配置的路径名变量 

opendir(3C), readdir(3C), closedir(3C)

执行目录操作 

mkdir(2)

生成目录 

readlink(2)

读取符号链接的值 

rename(2)

更改文件的名称 

rmdir(2)

删除目录 

symlink(2)

生成到文件的符号链接 

文件系统控制

下表中列出的文件系统控制接口可用于控制文件系统的各个方面。

表 5–3 文件系统控制接口

接口名称 

目的 

ustat(2)

获取文件系统统计信息 

sync(2)

更新超块 

mount(2)

挂载文件系统 

statvfs(2), fstatvfs(2)

获取文件系统信息 

sysfs(2)

获取文件系统类型信息