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;

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