zoukankan      html  css  js  c++  java
  • 共享内存使用的基本思路和接口

    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    
    #define MAXLINE 256
    /*
     *全文缺少错误检测和处理,仅用于了解共享内存使用的基本思路和基本接口
     *文章本意在于记录学习,程序有任何不妥之处,望不吝指正
     * */
    
    /*生成创建共享内存需要的key*/
    key_t mk_key()
    {
        /*0010只是我随便写的,没什么意思*/
        return ftok(".",0010);
    }
    
    int Shmget(key_t key,int shm_total)
    {
        int id=0;
    
        /*创建共享内存,0666是权限,IPC_CREAT是标志位,表示存在则返回id,不存在则创建*/
        if((id=shmget(key,MAXLINE*shm_total,0666|IPC_CREAT))==-1)
        {
            perror("shmget");
            exit(-1);
        }
    int load_data(int id,int pos,char *text,int total)
    {
        char *shm_p;
    
        /*获取共享内存首地址--个人理解和指针地址差不多,存放东西用的*/
        shm_p=(char *)shmat(id,NULL,0);
    
        /*向上面获取的地址放入字符串,pos表示位置偏移量*/
        memcpy(shm_p+20+pos*MAXLINE,text,MAXLINE);
    
        /*脱离共享内存--个人不知道有什么用,不脱离也可以啊*/
        shmdt(shm_p);
        return 0;
    }
    
    int read_data(int id,int total)
    {
        char *shm_p;
        int index=0;
        char text[MAXLINE];
    
        /*获取共享内存首地址--个人理解和指针地址差不多,存放东西用的*/
        shm_p=(char *)shmat(id,NULL,0);
    
        /*将来用于测试fork*/
        printf("pid :%d
    ",getpid());
    
        /*循环读取内容index表示位置偏移量,total表示总量*/
        while(1)
        {
            if(index == total)
                break;
            memcpy(text,shm_p+20+index*MAXLINE,MAXLINE);
    
            /*这里我打出来是测试看看的了,可以调用其他函数进一步处理*/
            printf("%s
    ",text);
            index++;
        }
    
        /*脱离共享内存*/
        shmdt(shm_p);
        return 0;
    }
    
    /*获取共享内存的基本信息,可以把结构体打印出来看看*/
    int shm_info(id)
    {
        struct shmid_ds buf;
        shmctl(id,IPC_STAT,&buf);
        return 0;
    }
    
    /*删除共享内存*/
    int destory_shm(id)
    {
        return shmctl(id,IPC_RMID,0);
    }
    
    main()
    {
        int index=0;
        int total=0;
        int id=0;
        char buff[MAXLINE];
        char file_name[MAXLINE];
        FILE *in_file;
    
        /*定义文件路径和文件名称*/
        sprintf(file_name,"%s/%s",getenv("HOME"),"/tmp/1.dat");
        if((in_file=fopen(file_name,"r"))==NULL)
        {
            perror("fopen");
            exit(-1);
        }
    
        /*计算文件总行数*/
        while(fgets(buff,MAXLINE,in_file) !=NULL)
            total++;
    
        /*重置文件偏移*/
        fseek(in_file,0,SEEK_SET);
    
        /*创建共享内存,获取id*/
        id=Shmget(mk_key(),total);
        while(fgets(buff,MAXLINE,in_file) !=NULL)
        {
            /*将文本刷入共享内存*/
            load_data(id,index,buff,total);
            index++;
        }
    
        /*读出来测试一下*/
        read_data(id,total);
    
        /*删除共享内存*/
        destory_shm(id);
    
        /*关闭文件标识*/
        fclose(in_file);
    }


  • 相关阅读:
    第四周作业
    第三周作业
    第二周基础作业
    抓老鼠
    币值转换
    打印沙漏
    秋季学期学习总结
    2019春第七周作业
    2019春第六周作业 学习总结
    第五周作业总结以及学习总结
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3453969.html
Copyright © 2011-2022 走看看