进程通信(共享内存)

1.概念

进程是操作系统分配资源的基本单位,也就是说进程间的资源是独立的。一个进程无法直接访问另一个进程的资源。可以通过进程通信来达到进程之间的访问互通。

在这里插入图片描述

3.创建IPC对象

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:
	生成一个key值,数值有点大
返回值:
	成功返回key,失败返回-1
参数:
	pathname:文件
	proj_id:随便一个好记的数字
	
key值是把pathname所表示的文件的inode值和proj_id经过一系列固定的运算生成而来

4.共享内存

4.1概念

共享内存在内核空间创建共享内存,让用户的A和B进程都能够访问到。通过这块内存进行数据的传递。

4.2创建/打开共享内存

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:
	打开已经存在的共享内存对象,或者创建一个不存在的对象后再打开
返回值:
	成功返回共享内存对象ID号,失败返回-1
参数列表:
	key:对应ID的关键字,IPC_PRIVATE表示私有对象,ftok来获得key
	size:共享内存大小
	shmflg:创建或打开的权限方式
		IPC_CREAT, IPC_EXCL

如果需要创建共享内存,那么还要传递权限 IPC_CREAT|0777

4.3.映射

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:
	把内核空间映射到用户空间,进程直接操作用户空间
返回值:
	成功返回映射后的地址,失败返回-1
参数列表:
	shmid:要映射的共享内存对象ID
	shmaddr:可以指定映射空间地址,使用系统指定就写NULL
	shmflg:映射空间的访问权限,SHM_RDONLY只读,0读写,没有只写	

4.4取消映射

#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
功能:
	把映射后的空间取消掉
返回值:
	成功返回0,失败返回-1
参数列表:
	shmaddr:映射后的地址

4.5.整体控制

#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:
	可以删除对象,查看对象属性,设置对象属性...
返回值:
	成功返回0,失败返回-1
参数列表:
	shmid:共享内存ID号
	cmd:如何操作对象
		IPC_STAT:获取对象属性
		IPC_SET:设置对象属性
		IPC_RMID:删除对象
	buf:用于存放信息的结构体
		如果删除对象写NULL
			struct shmid_ds {
               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 */
               ...
           };

5.linux删除共享空间

ipcrm -m shmid

6.linux 查看共享空间命令

ipcs

7.实例

/*===============================================
*   文件名称:shareMemory.c
*   创 建 者:     
*   创建日期:2023年12月27日
*   描    述:进程通信方式:
*               共享内存
*               1.获取key,ftok
*                 #include <sys/types.h>
                  #include <sys/ipc.h>
                  key_t ftok(const char *pathname, int proj_id);
  
*               2.创建/打开
*               int shmget
                3.映射到内存空间,参数分别为:
                共享内存id,映射空间地址,系统指定为NULL,文件访问权限(读:(SHM_RDONLY),读写:0)
*               返回值为void(*)shmat(shmid,NULL,0);
*               4.取消映射
*               shmrt
*               5.整体控制
*               shmctl
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char *argv[])
{ 
    //1.创建key
    key_t key=ftok(".",2024);
    printf("%d\n",key);
    //2.创建共享内存(有就打开,没有就创建)
    int shmid=shmget(key,512,IPC_CREAT | 0777);
    if(shmid<0){
        perror("shemget");
        return-1;
    }
    printf("%d\n",shmid);
    //3.映射到内存空间,参数分别为共享内存id,映射空间地址,系统指定为NULL,文件访问权限
    void *shmaddr=shmat(shmid,NULL,0);
    if(shmaddr==(void *)-1){
        perror("shmat");
        return-1;
    }
    printf("addr:%p\n",shmaddr);
    //往共享空间写入数据
    fgets(shmaddr,512,stdin);
    //4.取消映射
    int ret=shmdt(shmaddr);
    printf("ret:%d\n",ret);
    //5.整体控制(清除共享内存空间)
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
} 
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值