LinuxC实现内存映射
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
#include<sys/types.h>
int count=0;
typedef struct
{
char xuehao[40];
char name[30];
}Student;
Student *insert(Student *student)
{
int i;
printf("请输入姓名,学号\n");
scanf("%s%s",(student+count)->name,(student+count)->xuehao);
count++;
return student;
}
Student *delete(Student *student)
{
int i,flag,j;
char a[100];
printf("请输入一个学号\n");
scanf("%s",a);
for(i=0;i<count;i++)
{
if(strcmp((student+i)->xuehao,a)==0)
{
for(j=i;j<count;j++)
{
strcpy((student+j)->name,(student+j+1)->name);
strcpy((student+j)->xuehao,(student+j+1)->xuehao);
}
flag=0;
count--;
printf("delete success!!!\n");
break;
}
}
if(flag!=0)
printf("delete failed\n");
return student;
}
void chazhao(Student *student)
{
int i;
char b[100];
printf("请输入一个学号\n");
scanf("%s",b);
for(i=0;i<count;i++)
{
if(strcmp((student+i)->xuehao,b)==0)
{
printf("已找到\n");
printf("%s %s\n",(student+i)->name,(student+i)->xuehao);
break;
}
}
if(i==count)
printf("没有找到信息\n");
}
Student *xiugai(Student *student)
{
int i;
char c[100];
printf("请输入一个学号\n");
scanf("%s",c);
for(i=0;i<count;i++)
{
if(strcmp((student+i)->xuehao,c)==0)
{
printf("请输入要修改的信息\n");
scanf("%s%s",(student+i)->name,(student+i)->xuehao);
printf("修改成功\n");
break;
}
}
if(i==count)
printf("修改未成功\n");
return student;
}
int main(int argc,char** argv)
{
int n,fd;
Student *student;
Student *wq=(Student *)malloc(sizeof(Student));
fd=open(argv[1],O_RDWR|O_CREAT,0666);
if(fd<0)
{
printf("open %s failed\n",argv[1]);
exit(1);
}
write(fd,wq,sizeof(Student));
lseek(fd,1000*sizeof(Student),SEEK_CUR);
write(fd,wq,sizeof(Student));
close(fd);
fd=open(argv[1],O_RDWR);
if(fd<0)
{
printf("open %s failed\n",argv[1]);
exit(1);
}
if((student=(Student *)mmap(NULL,sizeof(Student)*1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==(Student*)-1);
{
perror("mmap\n");
}
close(fd);
fd=open("test",O_RDWR|O_CREAT,0666);
n=read(fd,&count,4);
if(n<0)
count=0;
close(fd);
while(1)
{
int number;
printf("\t\t\t请选择:\n");
printf("\t\t\t1.添加信息\n");
printf("\t\t\t2.删除信息\n");
printf("\t\t\t3.查找信息\n");
printf("\t\t\t4.修改信息\n");
printf("\t\t\t5.退出\n");
scanf("%d",&number);
switch(number)
{
case 1:
student=insert(student);
break;
case 2:
student=delete(student);
break;
case 3:
chazhao(student);
break;
case 4:
student=xiugai(student);
break;
case 5:
exit(0);
}
}
fd=open("test",O_RDWR);
write(fd,&count,4);
close(fd);
munmap(student,sizeof(Student)*1000);
return 0;
}