share memory linux

1. 创建共享内存

int shmid =shmget((key_t) key ,size_t size, int flag);
//key表示当前共享内存的key,单独表示共享内存的id
//size表示要开辟的共享内存大小
//flag表示权限,跟mode一样,如果不存在要与IPC_CREAT做或操作,
//返回共享内存的id

2. 连接当前进程
单独的创建出共享内存没有用,要与当前进程进行连接

void *shmat(int shm_id, const void *shm_addr, int shmflg); 
//shm_id表示想要连接的共享内存id
//shm_addr表示想要共享共享内存连接的地址,为0,表示系统自动选择
//shmflg标志位,通常为0

3. 共享内存分离进程

int shmdt(const void *shmaddr); 
//shmaddr 则是共享内存的地址 

4. 控制共享内存函数

int shmctl(int shm_id, int command, struct shmid_ds *buf);  
//shm_id 为共享内存id
//command : IPC_RMID 删除共享内存
//        :  IPC_SET 把共享内存的当前关联值设置为shmid_ds结构中给出的值
//        : IPC_STAT 把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值

5. 代码示例

数据结构

#define TEXT_SZ 2048  

struct shared_use_st
{
    int written;//作为一个标志,非0:表示可读,0表示可写  
    char text[TEXT_SZ];//记录写入和读取的文本  
};

写代码逻辑

#include<stdio.h>
#include<sys/shm.h>
#include<unistd.h>
#include"sharedata.h"
int main()
{
        struct shared_use_st *shared;
        int shmid;
        void *shm;
        shmid =shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
        if(shmid == -1)
        {
                return -1;
        }
        shm = shmat(shmid,0,0);
        if(shm ==  (void *) -1)
        {
                return -1;
        }
        shared = (struct shared_use_st *) shm;
        shared->written = 0;
        while(1)
        {
                if(shared->written == 0)
                {
                        printf("please write :\n");
                        scanf(" %s" , shared->text);
                        shared->written = 1 ;
                }
                else
                {
                        sleep(1);
                }

        }
        if(shmdt(shared)==-1)
        {
                return -1;
        }
        return 0;

}

读代码逻辑

int main()
{
        struct shared_use_st *shared;
        int shmid;
        void *shm;
        shmid =shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
        if(shmid == -1)
        {
                return -1;
        }
        shm = shmat(shmid,0,0);
        if(shm ==  (void *) -1)
        {
                return -1;
        }
        shared = (struct shared_use_st *) shm;
        shared->written = 0;
        while(1)
        {
                if(shared->written)
                {
                        printf("you wrote : %s\n", shared->text);
                        sleep(10);
                        shared->written = 0 ;
                        if(strncmp(shared->text,"end",3) == 0)
                        {
                                break;
                        }
                }
                else
                {
                        sleep(1);
                }

        }
        if(shmdt(shared)==-1)
        {
                return -1;
        }
        if(shmctl(shmid, IPC_RMID, 0) == -1)
        {
                return 0; 
        }
        return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章