linux c 中mmap来实现小型NoSQL数据库

涉及知识点:

mmap函数的映射;

mmap映射区域的增删查改

mmap映射结构体块儿

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <error.h>
typedef struct{
  char name[11];
  int num;
  int num1;
}people;
int main (int argc,char **argv)
{
    if(argc<2)
    {


        printf("请输入一个数据库名\n");
        break;
    }


  int fd,i=0,number;
  people * mapped;
  people *fp;
  fp=(people *)malloc(sizeof(people));
   strcpy(fp->name,"name");
   fp->num=1;
   fp->num1=1;
  fd=open(argv[1],O_RDWR|O_CREAT, 0666);
  if(fd<0)
  {
    printf("open argv[1] error\n");
    exit(0);
  }
 for(number=0;number<10;number++)
  write(fd,fp,sizeof(people));
  close(fd);
  fd=open(argv[1],O_RDWR);
  if(fd<0)
      printf("打开失败\n");
if((mapped=(people *)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==(people *)-1)
  {
    printf("mmap error\n");
    exit(0);
  }
close(fd);
while(1)
  {
    printf("1.添加 2.删除  3.查找\n");
    printf("4.更改 5.显示  6.退出\n");
    scanf("%d",&number);
    if(number==1)
      {
        printf("输入姓名学号\n");
        scanf("%s %d",(mapped+i)->name,&(mapped+i)->num);
      (mapped+i)->num1=1;
        i++;
      }
    else if(number==2)
    {
        char NAME[11];
        int j;
        printf("请输入姓名\n");
        scanf("%s",NAME);
        for(j=0;j<i;j++)
          {
            if((*(mapped+j)).num1==1)
            if(strcmp(NAME,(*(mapped+j)).name)==0)
              {
                (*(mapped+j)).num1=0;
                i--;
                break;
              }
          }
        if(i==j)
          printf("删除失败\n");
      }
    else if(number==3)
      {
        char NAME[11];
        int j;
        printf("请输入名字\n");
        scanf("%s",NAME);
        for(j=0;j<i;j++)
          {
            if((*(mapped+j)).num1==1)
              {
                if(strcmp(NAME,(*(mapped+j)).name)==0)
                  {
                      printf("姓名  学号\n");
                    printf("%s   %d",(*(mapped+j)).name,(*(mapped+j)).num);
                    break;
                  }
               }
          }
        if(i==j)
          {
            printf("无此人\n");
          }
      }
    else if(number==4)
      {
        char NAME[11];
        int j;
        printf("请输入名字\n");
        scanf("%s",NAME);
        for(j=0;j<i;j++)
        {
            if((*(mapped+j)).num1==1)
             {
                if(strcmp(NAME,(*(mapped+j)).name)==0)
                {
                    printf("请输入姓名学号\n");
                    scanf("%s%d",(*(mapped+j)).name,&(*(mapped+j)).num);
                    break;
                }
             }
        }
        if(i==j)
        {
            printf("无此人\n");
        }


    }
    else if(number==5)
    {
        int j;
        for(j=0;j<i;j++)
        {
           if(j==0) printf("学生姓名   学号\n");
           printf("%s  %d\n",(*(mapped+j)).name,(*(mapped+j)).num);
        }
    }
    else if (number==6)
    {
        break;
    }
    else
        printf("输入有错\n");


  }
if((munmap((people *)mapped,10*sizeof(people)))==-1)
printf("munmap error \n");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值