第三章 低级输入/输出
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一样在文件中有相同的位置。
(本文已被浏览 4002 次)
|
|