寒假学习 第九、十天 (linux 高级编程)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了寒假学习 第九、十天 (linux 高级编程),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2324字,纯文字阅读大概需要4分钟。
内容图文
![寒假学习 第九、十天 (linux 高级编程)](/upload/InfoBanner/zyjiaocheng/1305/3a522bc062b74b0f96c414df20b6e2e4.jpg)
寒假学习 第九、十天 (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对文件描述的属性的修改
原文:http://blog.csdn.net/billvsme/article/details/18746103
内容总结
以上是互联网集市为您收集整理的寒假学习 第九、十天 (linux 高级编程)全部内容,希望文章能够帮你解决寒假学习 第九、十天 (linux 高级编程)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。