共享内存使用的基本思路和接口

原创 2013年12月02日 09:33:31
#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\n",getpid());

    /*循环读取内容index表示位置偏移量,total表示总量*/
    while(1)
    {
        if(index == total)
            break;
        memcpy(text,shm_p+20+index*MAXLINE,MAXLINE);

        /*这里我打出来是测试看看的了,可以调用其他函数进一步处理*/
        printf("%s\n",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);
}

相关文章推荐

Spring_34_在 WEB 应用中使用 Spring 的基本思路

**重点: 核心是利用: 在web应用启动阶段,传入参数(spring配置文件的名称和路径),在监听器中获取这个参数,并用这个参数来创建ioc容器,并将它设置到servletcontext中的一个...

C#Windows窗体组成基本思路和控件使用

创建C#窗体时会产生一个主窗体(假设为Form1)此窗体被默认为程序的启动窗体, C#Windows程序有一个主程序,此主程序会加载创建的窗体Form1,而Form1窗体 的控件设计例如样式、位置和本...

XMPP的基本使用以及Android即时通讯的基本思路

-----开源框架XMPP的使用: 1.创建连接通道conn = new XMPPConnection(); 2.conn.login(用户名,密码);  进行登录,抛出异常则登录失败,否则登录成...

数字档案馆建设基本思路与构建

  • 2015年04月23日 00:03
  • 197KB
  • 下载

简略说明xbox三红维修基本思路

  • 2011年08月12日 14:56
  • 234KB
  • 下载

共享内存:使用内存映射接口mmap系统调用

http://blog.csdn.net/ghostyu/article/details/7736733 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不...
  • cjsycyl
  • cjsycyl
  • 2012年09月05日 10:35
  • 373

taobao 爬虫基本思路分享

通过以上接口我们就可以很方便的快速的获取 taobao ,tmall 平台开放的一些数据,在IP足量的情况下,做到即时更新,类似 双11 数据直播平台一样,展现数据销量分部等业务数据模型, 曾经获取数...

自己构建Struts框架的基本思路

  • 2013年12月31日 15:14
  • 83KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共享内存使用的基本思路和接口
举报原因:
原因补充:

(最多只允许输入30个字)