0
点赞
收藏
分享

微信扫一扫

UNIX环境高级编程学习


今天开始学习《UNIX环境高级编程》的第三章文件I/O的学习,本章包括了打开文件、读文件、写文件等等。下面是系统的介绍这些函数。

1.open函数

#include <fcntl.h>
int open(const char *pathname, int oflag, .../*mode_t mode*/);
Return filedescriptor if OK, -1on error



第三个参数通常用于新文件被创建时候的。


pathname参数是要打开或者要创建文件的名字,oflag参数的选项详见下面的选项。


O_RDONLY      只读打开。

O_WRONLY      只写打开。

O_RDWR           读写打开。

有且仅有一个这三个参数之中的一个被指定。下面的参数则是可选的。

O_APPEND       每次写的时候追加到文件的结尾。详见3.11

O_CREAT          如果文件不存在在创建一个文件,这个选项需要第三个open函数的第三个参数----mode,指定新文件得到的允许位。详见4.5

O_EXCL             如果O_CREAT被指定而且文件已经存在则产生一个错误。详见3.11

O_TRUNC         如果文件存在而且已只读或者读写的方式打开,则文件截断为0。
O_NOCTTY        如果pathname指定的是一个终端设备,不为此进程分配此设备的控制终端。详见9.6

O_NONBLOCK  如果parhname指定的是一个FIFO,一个块设备,或者一个特殊字节设备,此选项为本次打开文件和后续的非阻塞I/O操作。

下面的三个参数也是可选的,他们是有关同步输出和输入的选项。

D_DSYNC        使每次write等待物理I/O操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新。

O_RSYNC        使每一个以文件描述符作为参数的read操作等待,直至任何文件同一部分进行的未写操作都完成

O_SYNC           使每次write都等待物理I/O操作完成,包括write操作引起的文件属性更新所需的I/O

2.creat函数

也可调用creat函数创建一个新文件。

#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
//Return:file descriptor opened for write-only if OK,-1 on error#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
//Return:file descriptor opened for write-only if OK,-1 on error

这个函数等价于

open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

creat函数只能创建一个只写的文件,如果要创建一个临时文件,先读后写然后再调用creat,close,最后在open,最好的方式是调用open函数如下所示

open(pthname, O_RDWR | O_CREAT | O_TRUNC, mode);open(pthname, O_RDWR | O_CREAT | O_TRUNC, mode);

3.close 函数

文件调用close函数结束

#include <unistd.h>
int close(int filedes);
//Return:0 if OK,-1 on error#include <unistd.h>
int close(int filedes);
//Return:0 if OK,-1 on error

4.lseek 函数

#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// Return:new file offset if OK, -1 on error#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// Return:new file offset if OK, -1 on error

对offset参数的解释和whence有关

若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节

若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可正也可为负。

若whence是SEEK_END,则将文件的偏移量设置为文件长度加offset,offset可为正或负。

若lseek成功执行,则返回文件的偏移量,可以用下列方式查看当前打开文件的偏移量。

off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

举报

相关推荐

0 条评论