全部博文(1493)
分类: 嵌入式
2013-03-26 09:56:07
一、文件的IO操作
1.系统调用是指操作系统提供给用户程序调用的一组“特殊”接口。系统是一个软中断 机制向内核提交请求,通常程序员调用用户编程接口(API),但不是所有的函数 都一一对应一个系统调用。POSIX标准
2.
3.Linux 中对目录和设备的操作都等同于文件的操作。
4.一个进程启动时,都会打开 3 个文件:标准输入、标准输出和标准出错处理。 STDIN_FILENO、STDOUT_FILENO和 STDERR_FILENO(0、1、2);
5.不带缓存:是指每一个函数都只调用系统中的一个函数。open、read、write、lseek和 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 = 0,l_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 处理的模型有 5 种:阻塞 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");