Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660340
  • 博文数量: 109
  • 博客积分: 6081
  • 博客等级: 准将
  • 技术积分: 1318
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:28
文章分类
文章存档

2011年(8)

2010年(39)

2009年(62)

分类: LINUX

2009-10-24 10:55:56

 
1、文件I/O操作:
#include
#include
#include
1.1  打开一个文件
int open(const char *pathname, int oflag,  …/*, mode_t mode * / ) ;
返回:若成功为文件描述符,若出错为- 1
pathname: 打开文件的路径
oflag参数(这些常数定义在头文件中):
 O_RDONLY 只读打开
 O_WRONLY 只写打开
 O_RDWR 读、写打开。
O_APPEND 每次写时都加到文件的尾端。
O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
 O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
 O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。
O_NONBLOCK 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
O_SYNC 使每次w r i t e都等到物理I / O操作完成。
1.2 创建一个文件
int creat(const char * pathname, mode_t m o d e) ;
返回:若成功为只写打开的文件描述符,若出错为- 1。
注意,此函数等效于:
open (pathname, O_WRONLY | O_CREAT | O_TRUNC,  mode) ;
     c r e a t的一个不足之处是它以只写方式打开所创建的文件。
可用close函数关闭一个打开文件:
#include
int close (int filedes);
返回:若成功为0,若出错为- 1
 当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显式地用c l o s e关闭打开的文件。
如:例open.c
/*open.c*/
#include
#include
#include
#include
#include
#include
int main(void)
{
 int fd;
 
 if((fd = open("/tmp/hello.c", O_CREAT | O_TRUNC | O_WRONLY,0600 ))<0)
 {
  perror("open:");
  exit(1);
 }
 else
  printf("open file:hello.c %d\n",fd);
 
 if( close(fd) < 0 )
 {
  perror("close:");
  exit(1);
 }
 else
  printf("Close hello.c\n");
 
 exit(0);
}

1.3 文件定位
调用l s e e k显式地定位一个打开文件
#include
#include
off_t lseek(int filesdes, off_t offset, int whence) ;
返回:若成功为新的文件位移,若出错为- 1。
 对参数offset 的解释与参数w h e n c e的值有关。
若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。
若whence是SEEK_CUR ,则将该文件的位移量设置为其当前值加offset,offset可为正或负。
若whence是SEEK_END ,则将该文件的位移量设置为文件长度加offset,offset可为正或负。
若l s e e k成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前位移量:
off_t curr_pos;
Curr_pos = lseek(fd, 0, SEEK_CUR);
1.4 读文件
用r e a d函数从打开文件中读数据
#include
ssize_t read(int feledes, void *buff, size_t    nbytes) ;
返回:读到的字节数,若已到文件尾为0,若出错为- 1。
     如r e a d成功,则返回读到的字节数。如已到达文件的尾端,则返回0。
     有多种情况可使实际读到的字节数少于要求读字节数:
 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有3 0个字节,而要求读1 0 0个字节,则r e a d返回3 0,下一次再调用r e a d时,它将返回0 (文件尾端)。
 当从终端设备读时,通常一次最多读一行(第11章将介绍如何改变这一点)。
 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
 某些面向记录的设备,例如磁带,一次最多返回一个记录。
     读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。

1.5 写文件
用w r i t e函数向打开文件写数据。
#include
ssize_t write(int filedes, const void * buff,
  size_t nbytes) ;
返回:若成功为已写的字节数,若出错为- 1。
     其返回值通常与参数nbytes的值不同,否则表示出错。w r i t e出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。
1.6 改变打开文件属性
fcntl函数可以改变已经打开文件的性质。
#include
#include
#include
int fcntl(int filedes, int cmd, ... ) ;
返回:若成功则依赖于cmd(见下),若出错为- 1。
f c n t l函数有五种功能:
 复制一个现存的描述符, 新文件描述符作为函数值返(c m d=F_DUPFD)。
 获得/设置文件描述符标记,对应于filedes 的文件描述符标志作为函数值返回.(c m d = F_GETFD或F_SETFD)。
 获得/设置文件状态标志,对应于filedes 的文件状态标志作为函数值返回。(c m d = F_GETFL或F_SETFL)。
 获得/设置异步I / O有权(c m d = F_GETOWN或F_SETOWN)。
 获得/设置记录锁(c m d = F_SETLK , F_SETLKW)
 
 F_SETFL 将文件状态标志设置为第三个参数的值(取为整型值)。可以更改的几个标志是:O _ A P P E N D,O _ N O N B L O C K,O _ S Y N C和O _ A S Y N C。
 F_GETOWN 取当前接收S I G I O和S I G U R G信号的进程I D或进程组I D。
 F_SETOWN 设置接收S I G I O和S I G U R G信号的进程I D或进程组I D。正的a rg指定一个进 程I D,负的a rg表示等于a rg绝对值的一个进程组I D。
阅读(776) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~