Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1068948
  • 博文数量: 135
  • 博客积分: 10182
  • 博客等级: 上将
  • 技术积分: 1565
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 16:05
文章分类

全部博文(135)

文章存档

2011年(5)

2010年(20)

2009年(3)

2008年(16)

2007年(91)

分类: LINUX

2007-04-28 20:19:20

   编程在于练习,我打算认真操练一番。也不过是比着葫芦画瓢。当然写程序就是比着画。
 
1、文件描述符
在POSIX.1应用程序中,幻数0、1、2应被代换成符号常数S T D I N _ F I L E N O、S T D O U T _F I L E N O和S T D E R R _ F I L E N O。这些常数都定义在头文件中。
文件描述符的范围是0 ~ OPEN_MAX 。早期的U N I X版本采用的上限值是19 (允许每个进程打开2 0个文件),现在很多系统则将其增加至63。
2、open函数
#include
#include
#include
int open(const char *pthname,flags,int perms);
pathname是要打开或创建的文件的名字。flags参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成flags参数(这些常数定义在头文件中):
•O_RDONLY 只读打开。
•O_WRONLY 只写打开。
•O_RDWR 读、写打开。
很多实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2,以与早期的系统兼容。
在这三个常数中应当只指定一个。下列常数则是可选择的:
•O_APPEND 每次写时都加到文件的尾端。
•O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数perms,用其说明该新文件的存取许可权位。
•O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
•O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
•O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
•O_NONBLOCK如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
• O_SYNC使每次write都等到物理I/O操作完成。
3、close函数
可用close函数关闭一个打开文件:
#include
int close(int fd);
fd:文件描述符。
返回:若成功为0,若出错为-1。
4、read函数
#include
ssize_t read(int fd, void *buf, size_t nbytes);
返回:读到的字节数,若已到文件尾为0,若出错为-1
有多种情况可使实际读到的字节数少于要求读字节数:
• 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用r ead时,它将返回0(文件尾端)。
• 当从终端设备读时,通常一次最多读一行。
• 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
• 某些面向记录的设备,例如磁带,一次最多返回一个记录。
读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。
POSIX.1在几个方面对此函数的原型作了更改。其经典定义是:
int read(int fd, char *buf, unsigned nbytes);首先,为了与ANSI C一致,其第二个参数由char *改为void *。在ANSI C中,类型void *用于表示类属指针。其次,其返回值必须是一个带符号整数( ssize _ t),以返回正字节数、0(表示文件尾端)或- 1(出错)。最后,第三个参数在历史上是一个不带符号整数,以允许一个1 6位的实现可以一次读或写至65534个字节。在1990 POSIX.1标准中,引进了新的基本系统数据类型ssize_t 以提供带符号的返回值, size_t则被用于第三个参数。
5、write函数
#include
ssize_t write(int fd, const void *buf, size_t nbytes);
返回:若成功为已写的字节数,若出错为-1。
6、lseek函数
每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O _APPEND选择项,否则该位移量被设置为0。
可以调用lseek显式地定位一个打开文件。
#include
#include
off_t lseek(int fds, off_t offset, int whence) ;
返回:若成功为新的文件位移,若出错为- 1
对参数offset的解释与参数whence的值有关。
• 若w h e n c e是SEEK_SET,则将该文件的位移量设置为距文件开始处offset个字节。
• 若whence是SEEK_CUR,则将该文件的位移量设置为其当前值加offset, offset可为正或负。
• 若whence是SEEK_END,则将该文件的位移量设置为文件长度加offset, offset可为正或负。
若lseek成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前位移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE。

实例一:(待续)


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