进程间通信之共享内存(四)

共享内存
共享内存是将同一份物理内存映射到不同进程的地址空间中去;
共享内存是不带任何互斥和同步机制的进程间通信;
共享内存是所有进程间通信中最快的;
注:共享内存不需要数据的拷贝;
共享内存的生命周期随内核;
共享内存可以实现进程间的双向通信;

(一)创建共享内存

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

参数:
key: key_t  key  = ftok(const char* pathname,int proj_id);
size:为要创建的共享内存的大小;一般为页大小的整数倍;
shmflg:(1)shmflg   =  IPC_CREAT | IPC_EXCL;若为key的共享内存存在则:错误返回;若不存在,则:创建;
             (2)shmflg  = IPC_CREAT;若为key的共享内存存在则:打开;若不存在:创建;
返回值:
(1)创建成功:返回该共享内存的标识符;
(2)创建失败:返回-1;
二)挂接(将物理内存映射到进程的地址空间)
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid:挂接的共享内存的标识符;
shmaddr:NULL;
shmflg:0;
返回值:
(1)挂接成功:返回所挂接的共享内存的地址;
(2)挂接失败:返回-1;
(三)去挂接
int shmdt(const void *shmaddr);
参数:
shmaddr:为shmat的返回值(即为所挂接的共享内存的地址);
返回值;
(1)去挂接成功:返回0;
(2)去挂接失败:返回-1;

(四)释放共享内存
int shmctl(int semid,int cmd,struct shmid_ds* buf);

参数:
semid:共享内存的标识符;
cmd:IPC_RMID表示进行删除操作;
buf;当进行共享内存块释放时:为NULL;
返回值:
(1)释放成功:返回0;
(2)释放失败:返回-1;
common.h
#ifndef _COMMON_H
#define _COMMON_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#define PATHNAME "/home/cm"
#define PROJ_ID 0x6666
int Creat_ShareMemory(int size);
int Get_ShareMemory(int size);
int Destory_ShareMemory(int shm_id);

#endif
common.c
#include"common.h"

static int CommonCreat_ShareMemory(int size,int flags)
{
    key_t key = ftok(PATHNAME,PROJ_ID);
    if(key < 0)
    {
        perror("ftok");
        return -1;
    }
    int shm_id =  shmget(key,size,flags);
    if(shm_id < 0)
    {
        perror("shmget");
        return -2;
    }
    return shm_id;
}

int Creat_ShareMemory(int size)
{
    return  CommonCreat_ShareMemory(size,IPC_CREAT | IPC_EXCL | 0666);
}
int Get_ShareMemory(int size)
{
    return  CommonCreat_ShareMemory(size,IPC_CREAT);

}
int Destory_ShareMemory(int shm_id)
{
    int ret =  shmctl(shm_id,IPC_RMID,NULL);
    if(ret < 0)
    {
        perror("shmctl");
        return -1;
    }
    return 0;
}
server.c
#include"common.h"
//server

int main()
{
    int shm_id = Get_ShareMemory(4096);
    //printf("shm_id = %d\n",shm_id);
    char* addr = shmat(shm_id,NULL,0);
    //sleep(2);
    int i =0;
    while(i<26)
    {
        printf("client# %s\n",addr);
        i++;
    }
    shmdt(addr);
    sleep(2);
    Destory_ShareMemory(shm_id);
    return 0;

}
client.c
#include"common.h"
//client
int main()
{
    int shm_id = Creat_ShareMemory(4096);
    sleep(1);
    char* addr = shmat(shm_id,NULL,0);
    sleep(2);
    int i =0;
    while(i<26)
    {
        addr[i] = 'A'+i;
        i++;
        addr[i] = 0;
    }
    shmdt(addr);
    sleep(2);
    return 0;

}
Makefile
.PHONY:all
all:client server

client:client.c common.c
    gcc -o $@ $^
server:server.c common.c
    gcc -o $@ $^

.PHONY:clean
clean:
    rm -rf server client

作者水平有限,若有问题,请留言,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值