Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1760162
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类: 嵌入式

2013-03-26 09:56:07

原文地址:文件的IO操作 作者:小霸王88

一、文件的IO操作

1.系统调用是指操作系统提供给用户程序调用的一组“特殊”接口。系统是一个软中断 机制向内核提交请求,通常程序员调用用户编程接口(API),但不是所有的函数 都一一对应一个系统调用。POSIX标准

2.

3.Linux 中对目录和设备的操作都等同于文件的操作。

4.一个进程启动时,都会打开 个文件:标准输入、标准输出和标准出错处理。   STDIN_FILENOSTDOUT_FILENO和 STDERR_FILENO012);

5.不带缓存:是指每一个函数都只调用系统中的一个函数。openreadwritelseek   close

Open

fd1=open(argv[1],O_RDWR,0777)//返回的是文件描述符,

Close:

close(fd1)   //直接把文件描述符穿进去

Lseek:

lseek(fd1,0,SEEK_SET);//第二个参数为偏移量,第三个参数为一开始当前的位置, 头:SEEK_SET;当前:SEEK_CUR;结尾:SEEK_END;返回的是文件的当前位移

len = lseek(fd1,0,SEEK_END);//可求出文件的长度

Read:

Size1 = read(fd1,buf_rw,1)//文件描述符,读出来要放的buffer,每次读的字节数, 返回的是所读出来的字节数 ==返回0代表已经到达文件末尾,故我们求文件长度 的时候,可用作循环结束的条件。记住:由于最后一个数不一定是\0,所以我们要 加上去,不然如果不是\0,会出现乱码。==buf_rw[1]='\0';

  Write:

size2 = write(fd2,buf_rw,1) //返回的是写进去的大小,将buf_rw的内容写入fd2中, 1代表写的字节数,返回写的字节数

返回-1代表出错,0为正确(这里除了read

二、Fcntl

1.避免共享的资源产生竞争的状态==上锁(建议性锁和强制性锁_(主))

2.共享锁:读取锁;     排斥锁:写入锁

3.  //read 可以两个进程同时给一个文件上锁

//write不可以两个进程同时给一个文件上锁

   //read或者在write不能给同一个文件再进行write或者read

4.小技巧  为加锁整个文件,通常的方法是将,l_start = 0l_whence=SEEK_SET l_len = 0

5.fcntl(fd,F_SETLK,&lock)

//文件描述符,F_SETLK,设置lock描述的文件锁;记录锁的状态。

6.fcntl(fd,F_GETLK,&lock)//根据lock描述,决定是否上锁。

7.Eg:lock.l_type == F_RDLCK

 返回0代表可以上锁,否则为不能上锁。

8.   Struct flock

{

short l_type;//F_RDLCK(读取锁)F_WRLCK(写入锁);F_UNLCK(解锁)

off_t l_start; //相对位移offset

short l_whence;//SEEK_SET;SEEK_CUR当前;SEEK_END

off_t l_len; //加锁区域的长度

pid_t l_pid;

}

Eg lock_set(fd,F_RDLCK);

getchar();

lock_set(fd,F_UNLCK);

getchar();

close(fd); 

三、Select:函数根据希望进行的文件操作对文件描述符进行分类处理。

1.I/O 处理的模型有 种:阻塞 I/O 模型、非阻塞模型、I/O 多路转接模型、信号驱 动 I/O 模型、异步 I/O 模型

2.普通文件不管是阻塞还是非阻塞打开,如果没数据读,都立即返回。

  而设备文件我们可以设置内核的poll函数以达到没数据读或文件不可写时阻塞的   效果。所以对普通文件,意义不大,只是为了理解原理。

3、Select

select(maxfd+1,&inset1,&inset2,NULL,&lai)

需要检查的号码最高的文件描述符+1; 读文件描述符集合; 写文件描述符集合;

NULL:永远等待,知道捕捉到信号或文件描述符已做好准备为止,timeout,等待的 timeout(时间你自己设) 还没有文件描述符准备好,则立即返回;

最后一个参数,传结构体名

struct timeval{

long tv_sec; /* second */

long tv_unsec; /* and microseconds*/

}

返回准备好的文件描述符,出错-1

4.

5.FD_ISSET 测试到读集或写集可读写,返回1。说明内容有变化。

6.在使用 select 函数之前,首先使用 FD_ZERO 和 FD_SET 来初始化文件描述符集, 在使用了select 函数时,可循环使用 FD_ISSET 测试描述符集,

在执行完对相关后文件描述符后,使用 FD_CLR 来清楚描述符集。

7.在每次while循环后面都要加上 注:每次做完一次读写都要重新登记

  if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0) 

perror("select");

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