寒假学习 第九、十天 (linux 高级编程)
一、IO与文件映射
1.IO的共享与效率
read与write其中数据缓冲的大小读取数据的缓冲:getpagesize。
2.定位与定位读取(随机读取)
read与write在操作时,自动移动读取位置
(1)用lseek 可以 改变读取位置
lseek的函数说明: off_t lseek( int fd,//定位文件描述符号 off_t off,//定位位置 int whence//定位参照点:文件开始位置/文件结束位置/文件当前位置 //SEEK_SET SEEK_END SEEK_CUR ); 返回: 返回当前读取位置在文件中的绝对位置.
(2)pread/pwrite
相当与 lseek+write=pwrite
lseek+read =pread
列子:读取/proc/${pid}/mem 文件(mem是文件程序的虚拟内存文件,程序空间都是虚拟映射到这个文件中)
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> int a=222; int main(int argc, const char *argv[]) { char filename[100]; int data; sprintf(filename,"/proc/%d/mem",getpid()); int fd=open(filename,O_RDONLY); if(fd==-1) printf("Open ERROR:%m"),exit(-1); /* pread(fd,&data,4,(int)&a);//这行等同于下面两行 */ lseek(fd,(int)&a,SEEK_SET); read(fd,&data,sizeof(data)); printf("%d\n",data); lseek(fd,(int)&a,SEEK_SET); write(fd,&data,4); //虽然执行不会出错,但是a的值是不会改变的 printf("%d\n",data); return 0; }
mem只能读取,无法改变
(3)文件的其他操作
fstat获取文件状态
ftruncate改变文件大小
列子见下面的
(4)文件映射,内存方式写入数据
虚拟地址映射到内存,也可以映射到文件。映射到文件,我们就可以用内存方式访问文件.
列子:
#include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> struct stu { char name[20]; int age; float score; }; int main(int argc, const char *argv[]) { int fd; struct stat st; struct stu *s; memset(&st,0,sizeof(st)); int count; fd=open("map.dat",O_RDWR|O_CREAT|O_EXCL,0666); if(fd==-1){ fd=open("map.dat",O_RDWR); if(fd==-1) printf("Open ERROR:%m"),exit(-1); } fstat(fd,&st); //读取文件信息 count = st.st_size/sizeof(struct stu); ftruncate(fd,st.st_size+sizeof(struct stu)); //扩大文件 s=mmap(0,st.st_size+sizeof(struct stu), //0表示友系统自动指定开始 PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//原来映射到内存时要MAP_ANONYMOUS建立匿名映射,现在不用了。 printf("input name:"); scanf("%s",s[count].name); printf("input age:"); scanf("%d",&s[count].age); printf("input score:"); scanf("%f",&s[count].score); int i; printf("already in dat:\n"); for(i=0;i<count+1;++i){ printf("%s\t%d\t%.2f\n",s[i].name,s[i].age,s[i].score); } munmap(s,sizeof(st.st_size+sizeof(struct stu))); close(fd); return 0; }
输入student的数据,并且输出
二.文件描述符号的操作(IO锁)
1.dup dup2
dup拷贝文件符号,返回系统指定的整数dup2拷贝文件描述符号,返回用户指定的整数
2.fcntl对文件描述的属性的修改
以后的学习会学到,到时候在详细的写。