进程通信之共享内存

共享内存读写

shm_write.c

//int shmget(key_t key, size_t size, int shmflg)
//功能:创建或打开一块共享内存
//参数🔑IPC键值
// size:共享内存大小
// shmflg:位或权限位
// IPC_CREAT:创建
// IPC_EXCL:检测是否存在
//返回值:成功返回ID,失败-1

//void *shmat(int shmid, const void *shmaddr, int shmflg)
//功能:将一个共享内存映射到调用进程的数据段
//参数:shmid:共享内存ID
// shmaddr:共享映射内存地址,一般写NULL由系统指定
// shmflg:
// 0:共享内存可读可写
// SHM_RDONLY:只读
//返回值:成功返回地址,失败-1

//int shmdt(const void *shmaddr)
//功能:解除映射
//参数:共享内存地址
//返回值:成功0,失败-1

//int shmctl(int shmid, int cmd, struct shmid_ds *buf)
//功能:控制共享内存
//参数:shmid:共享内存标识符
// cmd:函数功能控制
// IPC_RMID:删除
// IPC_SET:设置参数
// IPC_STAT:保存参数
// IPC_LOCK:锁定
// buf:shmid_ds数据类型地址,用来存放属性
//返回值:成功0,失败-1

#include <stdio.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>



int main(int argc, char *argv[])
{
    key_t key;
    int shmid = 0;
    char *str = NULL;
 
    key = ftok(".", 1);
    shmid = shmget(key, 1024, IPC_CREAT | 0666);
    if(shmid == -1)
    {
        perror("shmget");
        return 0;
    }
    str = (char *)shmat(shmid, NULL,0);
    
    strcpy(str, "this is my data save to shared memory");
    printf("copy data to shared memory success\n");
    system("ipcs -m");

    return 0;
}

shm_read.c

#include <stdio.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    key_t key;
    int shmid = 0;
    char *str = NULL;
    int ret = 0;
 
    key = ftok(".", 1);
    shmid = shmget(key, 1024, IPC_CREAT | 0666);
    if(shmid == -1)
    {
        perror("shmget");
        return 0;
    }
    str = (char *)shmat(shmid, NULL,0);

    printf("read data:%s\n", str);
    if(shmdt(str) < 0)
    {
        perror("shmdt");
        return 0;
    }

    ret = shmctl(shmid, IPC_RMID, NULL);
    if(ret == -1)
    {
        perror("shmctl");
        return  0;
    }
    system("ipcs -m");

    return 0;
}

执行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值