APUE——文件IO

1.文件描述符

       文件描述符(fd)是一个无符号整数,Unix使用中文件描述符012分别对应标准输入、标准输出、标准错误。在unistd中分别定义了STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO来表示012

2.open函数

#include <fcntl.h>  //注意open定义在这个头文件中
int open( const char * pathname,int flags, …/*mode_t mode*/);
						//成功返回文件描述符,出错返回-1

 

         函数说明参数pathname指向欲打开的文件路径字符串。下列是参数flags所能使用的旗标:

O_RDONLY以只读方式打开文件

O_WRONLY以只写方式打开文件

O_RDWR以可读写方式打开文件。

         上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。

O_CREAT若欲打开的文件不存在则自动建立该文件。

O_EXCL如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若

O_CREATO_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

O_TRUNC若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。

O_APPEND当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

 

       也可以调用create函数来创建一个文件,但是create创建的文件是只写的,如果要读的话,就要先关闭文件然后再open,所以不如直接用带O_CREATEopen函数。

注意:第三个参数是文件权限参数,在用O_CREAT标志打开文件的时候,如果不默认是需要至指定权限的,最为宽松的权限就是0x777。

3. close函数

#include <unistd.h>
int close(int filedes);  //filedescriptor
			//成功为0,出错为-1

4. lessk函数

#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
				//成功返回新的文件偏移量,出错返回-1


 

        whence可以取的值有三种:SEEK_SETSEEK_CURSEEK_END,代表的数字分别问012,表示文件开始、当前位置、文件末尾。

问题:如果使用添加标志(O_APPEND)打开一个文件读写,能否用lseek在任意位置开始读?能否用lseek在任意位置输入?

答:可以在任意位置读,但是调用write写是,自动调至文件尾进行添加,且是原子操作。

       代码示例:

//创建一个具有空洞的文件
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
char str1[]=”Hello”;
char str2[]=”World”;
int fd;
int main()
{
	if((fd=open(“file.hole”,O_CREATE|O_RDWR))==-1)
	{	
		printf(“open file error!\n”);
		return 0;
	}
	write(fd,str1,5);
	lseek(fd,10000,SEEK_SET);
	write(fd,str2,5);
	return 0;
}


5.read&write函数

#include <unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes);
						//成功返回读入的字节数,文件结尾返回0,出错返回-1
ssizet write(int filedes, void *buf, size_t nbytes);
						//成功返回已写字节数,出错返回-1
//这两个函数的参数是一样的,注意其中的缓冲区

6.dup&dup2函数

        dupdup2都是用来复制一个现存文件描述符的。

#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, int filedes2);
					//成功返回新的文件描述符,出错返回-1

 

        由dup返回的文件描述符一定是当前未用文件描述符中最小的,而dup2是可以指定复制到哪个文件描述符(第二个参数),如果filedes2已经打开,那么就先关闭,然后再复制。

7.sync、fsync和fdatasync函数

         sync就是冲洗缓冲区,就像C++中用的cin.sync()操作。理解这几个函数首先要有内核的缓冲区和写队列的概念。

#include <unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
			//成功返回0,出错返回-2
void sync(void);
/*说明:sync是对所有文件起作用,将所有修改过的块缓冲,排入写队列,但是不等待写完成即返回;fsync只对文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束;fdatasync类似于fsync,但它只影响文件的数据部分,fsync还会同步更新文件的属性*/


 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值