linux共享内存(shared memory)使用介绍

共享内存是IPC机制中的一种,顾名思义,它允许两个不相关的进程访问同一段内存,这也是一种传递数据的有效方式。

通过man命令可以查看各个函数的详细说明:

Int shmget(key_t key,size_t size,int shmflg);

功能:创建或获取共享内存,并返回其对应的描述符id

返回值:成功,返回创建或获取对应共享内存的描述符,失败返回-1

参数说明:key:共享内存的键值,size:共享内存的大小,shmflg:打开标志,如果一开始没有现成的共享内存,并设置了IPC_CREATE标志,则会新创建一块共享内存

void* shmat(int shmid,const void* shmaddr,int shmflg);

功能:把shmid指定的共享内存映射到进程的地址空间里(各个进程的地址不一样)

返回:成功返回映射到进程空间之后的内存地址

参数:shmid:要映射的共享内存的描述符,shmaddr:指定映射到内存之后的地址(可以自己指定一个空闲地址),一般会产生冲突,默认的情况下,这个参数都填为NULLL,让linux系统自动的选择映射的地址

shmflg:打开标志

 

Int shmdt(const void* shmaddr);

功能;把进程空间的地址与共享内存断开,但是共享内存这片空间还不能被使用

成功返回0,失败返回-1,

shmaddr:要断开共享内存的地址

 

Int shmctl(int shmid,int cmd,struct shmid_ds* buf);

功能:控制共享内存,把共享内存释放掉,归回给操作系统,其它进程可以,

接着用

成功;根据不同的操作返回不同的值,失败返回-1,

参数:要控制的共享内存的id,

cmd;决定要执行什么样的操作,比如IPC_RMID表示删除共享内存,

buf:获取liunx中描述共享内存的shmid_ds结构,基本不使用,

共享内存通信举例:

//write.c
//命令:gcc -g write.c -o write
//./write
#include
#include
#include
#include
#include
#include
#define TEXT_SZ 2048
struct shared_use_st
{
    int write_by_you;       //这个标志判断是否数据被读取
    char some_text[TEXT_SZ];    

};
int main()
{
    int shmid;
    int running = -1;
    struct shared_use_st *shared_stuff;
    char buffer[TEXT_SZ];
    shmid =  shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
    if(shmid  == -1)
    {
        printf("creat share memory failed!\n");
        exit(EXIT_FAILURE);
    }
    shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);
    
    while(running)
    {
        while(shared_stuff->write_by_you == 1)  
        {
            sleep(1);
            printf("wait read process");
        }
        fgets(buffer,TEXT_SZ,stdin);     
        strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
        shared_stuff->write_by_you = 1;
        if(strncmp(buffer,"quit",4) == 0)
        {
            running = 0;
        }
    
    }
    
    shmdt((const void*)shared_stuff);
    return 1;

}

//read 先运行
//命令:gcc -g read.c -o read
#include
#include
#include
#include
#include
#include
#define TEXT_SZ 2048
struct shared_use_st
{
    int write_by_you;
    char some_text[TEXT_SZ];    

};

int main()
{
    int shmid;
    int running = 1;
    struct shared_use_st *shared_stuff;
    shmid =  shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
    shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);
    shared_stuff->write_by_you = 0
    while(running)    
    {
        if(shared_stuff->write_by_you = 1)
        {
            printf("write process write %s\n",shared_stuff->some_text);
            shared_stuff->write_by_you = 0;    
            if(strncmp(shared_stuff->some_text,"quit",4) == 0)
            {
                running = 0;
            }
            
        }
    }
    
    shmdt((const void*)shared_stuff);
    
    shmctl(shmid,IPC_RMID,0);
    return 1;
}

 

 

 

 

 

 

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