Chinaunix首页 | 论坛 | 博客
  • 博客访问: 494342
  • 博文数量: 77
  • 博客积分: 1047
  • 博客等级: 少尉
  • 技术积分: 898
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-25 17:16
文章分类

全部博文(77)

文章存档

2016年(2)

2013年(2)

2012年(33)

2011年(40)

分类: 系统运维

2012-09-27 15:14:15

#include
//打开或创建一个文件,成功则返回文件描述符,出错返回-1
int open(const char *pathname,int oflag,.../* mode_t mode */);

oflag必选参数(并且只能指定一个):
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开

oflag可选参数:
O_APPEND 每次写时都追加到文件的尾端
O_CREAT 若此文件不存在,则创建它(若文件已经存在,则会出错)。使用此选项时,需要第三个参数mode,用其指定新文件的访问权限位
O_EXCL 测试文件是否存在,如果不存在,则创建此文件。
O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度揭短为0
O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端
O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,为文件的本次打开操作和后续的I/O操作设置非阻塞模式

O_DSYNC 使每次write等待物理I/O操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新
O_RSYNC 使每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成
O_SYNC 使每次write都等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/O

调用示例:
int file1 = open("/temp.txt",O_WRONLY|O_APPEND);


------------
#include
//创建一个文件,成功则返回只写打开的文件描述符,出错返回-1
int create(const char *pathname,mode_t mode);
此函数等效于:
open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);

------------
#include
//关闭一个打开的文件,成功则返回0,出错则返回-1
int close(int filedes);


------------
#include
//显式地为一个打开的文件设置偏移量,成功则返回新的文件偏移量,出错则返回-1
off_t lseek(int filedes,off_t offset,int whence);

whence可选值:
SEEK_SET 文件偏移量设置为距文件开始处offset个字节
SEEK_CUR 文件偏移量设置为其当前值加offset,offset可为正或负
SEEK_END 文件偏移量设置为文件长度加offset,offset可为正或负

调用示例:
off_t currpos = lseek(fd,0,SEEK_CUR);//若成功则返回新的文件偏移量


------------
#include
//从打开文件中读数据,成功则返回读到的字节数,若已到文件结尾则返回0,出错返回-1
ssize_t read(int filedes,void *buf,size_t nbytes);


------------
#include
//向打开文件写数据,成功则返回已写的字节数,出错返回-1
ssize_t write(int filedes,const void *buf,size_t nbytes);

------------原子操作
#include
//返回读到的字节数,若已到文件结尾则返回0,出错返回-1。调用pread相当于顺序调用lseek和read
ssize_t pread(int filedes,void *buf,size_t nbytes,off_t offset);
//若成功则返回已写的字节数,出错返回-1。调用pwrite相当于顺序调用lseek和write
ssize_t pwrite(int filedes,const void *buf,size_t nbytes,off_t offset);


------------复制一个现存的文件描述符
#include
//若成功则返回新的文件描述符,出错返回-1。返回的新文件描述符与参数filedes共享同一个文件表项
//dup返回的新文件描述符一定时当前可用文件描述符中的最小数值
int dup(int filedes);
//dup2则可以用filedes2参数指定新描述符的数值。如果filedes2已经打开,则先将其关闭。
int dup2(int filedes,int filedes2);

调用示例:
dup(filedes); 等效于 fcntl(filedes,FDUPFD,0);
dup2(filedes,filedes2); 等效于 close(filedes2); fcntl(filedes,FDUPFD,filedes2);


------------为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性
#include
//若成功则返回0,出错返回-1。
//fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回
int fsync(int filedes);
//fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性
int fdatasync(int filedes);
//sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束
void sync(void);


------------fcntl函数可以改变已打开的文件的性质
#include
//若成功则依赖于cmd,若出错则返回-1
int fcntl(int filedes,int cmd,.. /* int arg */ );

fcntl函数有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)

cmd值的前7种:
F_DUPFD 复制文件描述符filedes.新文件描述符作为函数值返回。它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值
F_GETFD 对应于filedes的文件描述符作为函数值返回
F_SETFD 对于filedes设置文件描述符标识。新标志值按第三个参数设置
F_GETFL 对应于filedes的文件状态标识作为函数值返回
F_SETFL 将文件状态标识设置为第三个参数的值
F_GETOWN 取当前接收SIGIO和SIGURG信号的进程ID或进程组ID
F_SETOWN 设置接收SIGIO和SIGURG信号的进程ID或进程组ID

阅读(2440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~