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

#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);

}


你可能感兴趣的:(共享内存)