Linux进程间通信方式

前言

进程间通信的目的

操作系统为用户提供的用于实现进程之间进行通信的方式。 

Notes:进程之间是无法直接通信的,因为每一个进程都有自己独立的虚拟地址空间,所以进程具有独立性,无法直接通信。

进程间通信方式有几类:匿名管道、命名管道、共享内存、消息队列、域socket、信号量。

一、匿名管道

二、命名管道

三、共享内存

本质:一块物理内存

原理:开辟一块物理内存空间,多个进程将同一块内存通过页表映射到自己的虚拟地址空间,通过自己的虚拟地址空间直接进行访问。

操作流程:
1.创建或打开共享内存
2.将共享内存映射到进程的虚拟地址空间
3.通过映射的虚拟地址进行各种内存操作
4.解除映射关系
5.删除共享内存
共享内存的生命周期随内核,不与进程同进退。

操作接口:

#include <sys/shm.h>

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

Key:标识符,多个进程通过相同的标识符打开同一块共享内存
Size:创建时候所开辟空间大小,如果已经内存存在,则被忽略。(以内存页为单位,默认是:4096个字节)
Shmflg:打开方式+创建权限(IPC_CREAT | IPC_EXCL | 0664)
返回值:成功:返回非负整数–>操作句柄;失败返回-1。

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

Shmid:shmget返回的操作句柄
Shmaddr:映射地址–通常为NULL;
Shmflg:映射成功后的访问方式:SHM_RDONLY-只读;0-读写
返回值:成功返回映射后的首地址,失败返回(void)-1;

int shmdt(const void *shmaddr);

解除映射关系。Shmaddr:映射后的首地址。
返回值:成功0,失败-1;

int shmctl(int shmid, int cmd, struct shmid_ds *buf);删除共享内存
Shmid:shmget返回的操作句柄,cmd:操作类型–IPC_RMID–标记共享内存为被销毁状态。Buf:同于设置或获取共享内存信息,不使用则置null,返回值对于IPC_RMID则是成功0,失败-1;
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值