寒假学习 第九、十天 (linux 高级编程)
read与write其中数据缓冲的大小读取数据的缓冲:getpagesize。
read与write在操作时,自动移动读取位置
lseek的函数说明: off_t lseek( int fd,//定位文件描述符号 off_t off,//定位位置 int whence//定位参照点:文件开始位置/文件结束位置/文件当前位置 //SEEK_SET SEEK_END SEEK_CUR ); 返回: 返回当前读取位置在文件中的绝对位置.
相当与 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;
}
fstat获取文件状态
ftruncate改变文件大小
列子见下面的
#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的数据,并且输出
dup拷贝文件符号,返回系统指定的整数dup2拷贝文件描述符号,返回用户指定的整数
原文:http://blog.csdn.net/billvsme/article/details/18746103