第三章 低级输入/输出
3.1 概述 与第二章内容相对应,本章介绍UNIX系统中通过系统调用来实现的输入/输出,通常称之为低级输入/输出。这些系统调用能够直接实现对设备(如磁带驱动器等)的输入和输出,程序员能够决定要使用的缓冲区的大小,而不象标准输入/输出库函数那样透明设定缓冲区大小。
在标准输入/输出库中,一个文件是由一个文件指针来对应的。当使用低级界面时,则用一个文件描述字对应一个文件。文件描述字是一个小的整数。有3个事先定义的文件描述字0、1和2,分别对应标准输入、标准输出和标准错误输出。一般说来,文件描述字都是作为系统调用的第一个参数给出的。
3.2 相关系统调用介绍
·文件创建和关闭 open()用于为读写而打开一个文件,或用它来创建新文件。
int open (const char *path, int oflag, ... /* mode_t mode */);
open使用三个参数:一个字符串path包含要打开的文件名;
一个整数oflag指明文件将被如何打开;
整数mode在创建文件时使用。
常用的oflag包括:
O_RDONLY 打开文件仅用于读。
O_WRONLY 打开文件仅用于写。
O_RDWR 打开文件用于读写。
O_CREAT 如果文件不存在,则创建,此时mode作为第三个参数给出。
close()用于关闭一个已经打开的文件。
·文件读写 read()用于读文件,格式为: read(int fildes, void *buf, size_t nbyte);
三个参数说明如下:
filedes是文件描述字;
指针buf指向一个数据将被读入的缓冲区;
整数nbytes指明要读的字节个数。
成功时返回实际读入的字节数,出错则返回-1。
write()用于写文件,与read类似,格式为: write(int fildes, void *buf, size_t nbyte);
三个参数说明如下:
filedes是文件描述字;
指针buf指向一个数据将被写入的缓冲区;
整数nbytes指明要写的字节个数。
成功时返回实际写入的字节数,出错则返回-1。
·文件移动定位用于在文件中移动的低级输入/输出系统调用是lseek(),
与fseek()类似,它也接收三个参数:
一个文件描述字对应一个打开的文件;
一个整数指明要移动的字节数,称为offset;
一个整数指明从文件中什么位置移动。
·复制文件描述字有时候有不只一个文件描述字对应一个文件。
当创建子进程时(参加后面关于进程开发的章节),这一点很常用。
为了获得一个新的文件描述字,并保证其与fd对应同一个文件,应调用 fd2 = dup(fd) fd2现在和fd对应同一个文件,并且和fd一样在文件中有相同的位置。