system V IPC对象---共享内存

本文介绍了如何在Linux Ubuntu系统中使用C语言进行System V IPC共享内存的操作,包括创建或打开共享内存、映射内存、访问内存、取消映射和删除共享内存的详细步骤。通过具体实例展示了两个进程之间如何通过共享内存进行数据交换,强调了运行顺序的重要性。
摘要由CSDN通过智能技术生成


共享内存是进程间通信效率最高的一种通信机制

首先我们要了解一个词–key
key就等于是一把钥匙,而共享内存就等于是一个共享的房间,但这个房间也不是什么人都可以进得去,得有钥匙,所以我们来看看key值得获取:

#include <sys/types.h>
#include <sys/ipc.h>

key_t  ftok(const  char  *pathname, int proj_id);
参数:
    pathname:任意路径
    proj_id:任意字符,因为它读取得是低8位,所以我们可以随便取个字符,
    让其和系统组合生成一把钥匙。
    eg:'a'、'i'、'?'。。。都行。
    
返回值:
    
    成功返回key值,失败返回-1;

共享内存的相关流程:

1、创建或者打开共享内存–shmget()

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);
参数:
    key:通过ftok得到的key值或者使用IPC_PRIVATE(创建私有共享内存)
    size:共享内存的大小
    shmflg:创建共享内存权限,一般填0664|IPC_CREAT-->有就打开,没有就创建
返回值:
    成功返回共享内存ID,失败返回-1

2、映射共享内存–shmat()

#include <sys/types.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
    shmid:共享内存ID
    shmaddr:映射地址,填NULL表示系统自动分配
    shmflg:SHM_RDONLY -- 只读
				0 -- 读写
返回值:
        成功返回映射地址,失败返回(void *)-1;

3、共享内存访问---->输入/输出/其他

4、取消映射–shmdt()

#include <sys/types.h>
#include <sys/shm.h>

int shmdt(const void *shmaddr);
参数:
    shmadr:要取消映射的地址
    
返回值:    成功返回0,失败返回-1

5、删除共享内存–shmctl()

#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd,struct shmid_ds *buf);
参数:
    shmid:共享内存id号
    cmd:操作共享内存的命令:
    IPC_STAT:获取共享内存信号,需要用到第三个参数
   struct shmid_ds { // ipc_stat 所用到的一些结构体成员,
               struct ipc_perm shm_perm;    /* Ownership and permissions */
               size_t          shm_segsz;   /* Size of segment (bytes) */
               time_t          shm_atime;   /* Last attach time */
               time_t          shm_dtime;   /* Last detach time */
               time_t          shm_ctime;   /* Last change time */
               pid_t           shm_cpid;    /* PID of creator */
               pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
               shmatt_t        shm_nattch;  /* No. of current attaches */
               
           };         
	IPC_SET:设置共享内存信息
    IPC_RMID:删除共享内存,第三个参数填NULL    
返回值:
  	成功返回0,失败返回-1

相关结构体成员含义:
在这里插入图片描述

6、实例

两个进程文件,一个进程向共享内存输入数据,一个进程从共享内存输出数据

代码演示:

输入端

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include 
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值