1: 文件操作的流程; 打开(open), 读(read) ,写( write ), 设置写/读时的操作偏移量(lseek), 关闭(close)。
2:操纵时的缓冲讨论。
文件描述符 :内核为打开文件所返回的一个“文件句柄”,是一个非负整数。变化范围(0~ OPEN_MAX)
按照惯例:标准输入的文件描述符 (0) STDIN_FILENO, 标准输出的文件描述符(1) STDOUT_FILENO 标准出错输出(2) STDERR_FILENO
a : 打开(open):
#incude<fcntl.h>
int open( const char *pathname, int flags, .../*mode_t mode*/)
返回值: 成功返回文件描述符, 失败返回-1.
说明:1)flags
O_RDONLY, O_WRONLY, O_RDWR . 这三个是必须要指定一个且只能指定一个。
下面的则是可选择的:
O_APPEND
O_CREAT: 若此文件不存在,则创建,使用这个参数时需要第三个参数 mode
(文件访问权限位 )。
O__TRUNC: 如果此文件存在,且是为写或读写打开的,则将文件截断为0.
O_NOCTTY: 如果此路径指的是终端设备,则不将该设备分配做为此进程的控制终端。
O_EXCL: 如果同时指定了O_CREAT,而文件已经存在,则出错。
用此可以测试一个文件是否存在。 如果不存在,则 创建之,
这使得测试存在和创建成为一个原子操作。
(Single UNIX specifiction / POSIX.1) 同步输入和输出的选项。
O_DSYNC : 使每次write等待物理I/O操作的完成,但是如果写操作并不影响读取刚写入 的数据, 则不等待文件属性被更新。
O_RSYNC: 使每个以文件描述符做参数的read操作等待,直至任何对文件同一部分进行的为决写操作都完成。
O_SYNC : 使每次的write操作都等到物理I/O完成。包括由write操作引起的文件属性更新所需要的I/O.
b :创建(creat)
#include<fcntl.h>
int creat( const char *pathname, mode_t mode)
返回值: 若成功返回为只写打开的描述符,若出错则返回-1
它等效于: open( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
creat的不足之处在与它是以只写方式打开所创建的文件。如果要创建一个临时文件(写 读) .
则要先调用creat close, 然后 open,有了open的选项参数后,可以使用
open( pathname, O_RDWR | O_CREAT | O_TRUNC, mode).
C: 位移量设置(lseek)
#include<unistd.h>
off_t lseek( int filedes, off_t offset , int whence )
返回值: 成功返回文件的偏移量, 若出错返回-1
1) 若whence 是SEEK_SET , 则将文件的偏移量设置在距文件开始处offset个字节处。
若whence 是SEEK_CUR, 则将文件的偏移量设置为当前位置加offset, offset可正可负。
若whence 是SEEK_END, 则将文件的偏移量设置为文件长度加offset , offset 可正可负。
off_t 是长整形数据。
若lseek成功执行,则返回新的文件偏移量,为此可以用下列方式确定文件的当前偏移量:
off_t currpe;
currpe = lseek( fd , 0 , SET_CUR);
2) 通常lseek返回非负数,但是某些设备允许使用负的偏移量。因此在比较返回值的时候,
不要测试它是否小于0, 而是要和-1做比较来判断它出错了没。
c:读取(read)
#include<unistd.h>
ssize_t read( int filedes , void *buf, size_t nbyte)
返回值: 若成功,则返回读到的字节数,若到文件结尾,则返回0, 若出错,则返回-1
d : 写 ( write)
#include<unistd.h>
ssize_t write( int filedes , const void *buf, size_t nbyte)
返回值: 若成功 , 返回已写的字节数。若失败返回-1. 若返回值与nbyte不同也表示出错。
e: 改变以打开文件性质( fcntl.h)
#include<fcntl.h>
int fcntl( int filedes , int cmd, .../*int arg */)
返回值: 若成功,依赖于cmd, 若出错则返回-1
有5中功能:
1) 复制一个现有的描述符( cmd = F_DUPFD)
2) 获得/设置文件描述符标记( cmd = F_GETFD / F_SETFD )
3) 获得/设置文件状态标志(cmd = F_GETFL / F_SETFL)
4) 获得/设置异步I/O所有权( cmd = F_GETOWN / F_SETOWN)
5) 获得/设置记录锁 ( cmd = F_GETLK / F_SETLK / F_SETLKW)
f: I/O 杂物箱 (ioctl )
#include<unistd.h> / * System V */
#incude<sys/ioctl.h> /* BSD and Linux */
#incude<stropts.h> /* XSI STREAMS */
int ioctl ( int filedes , int request , ...)
这几个头文件只是表示ioctl本身所需要的头文件,通常还需要另外设备的专用头文件。