进程间通信:IPC-共享内存

本文详细介绍了操作系统中的共享内存机制,包括System V和POSIX标准的接口使用,如shmget、shmat、shmdt和shmctl。通过示例展示了如何创建、连接、解除连接和管理共享内存,并探讨了共享内存的生命周期及其在进程间通信中的应用。通过实际代码展示了如何创建、删除、查看和修改共享内存的参数,以及如何在父子进程中利用共享内存进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共享内存:
操作系统接口标准:system V 标准、posix标准。System V共享内存机制: shmget  shmat  shmdt  shmctl
共享内存的原理 : 同一块物理内存映射到了多个进程的虚拟地址空间。
pathname->key->shmid->连接->使用->解除连接。
系统中每一个文件都是唯一的,所以可以用路径来产生key。同一个路径产生同一个key。同一个key可以打开或产生同一段共享内存。
每一段共享内存有一个ID:shmid。
共享内存在创建以后,随着进程结束不会释放。 因为是共享内存啊,你这个进程结束了,可能其他进程还要用。

key_t ftok(const char *pathname, int proj_id);      //产生key。proj_id通常传入一非0字符。
int shmget(key_t key, int size, int shmflg);           //根据key产生或打开一共享内存,得到shmid。key也可以自己指定。
void *shmat(int shmid, const void *shmaddr, int shmflg);  //attach.根据shmid连接共享内存。后面一般填NULL和0。连接共享内存得到的是
                                                                                        共享内 存在本进程的虚拟内存的首地址。共享内存在虚拟内存是连续的,但实
                                                                                        际物理 内存是否连续,不管你的事,管他呢~
int shmdt(const void *shmaddr);                                       //解除连接
int shmctl(int shmid, int cmd, struct shmid_ds *buf);  //参数cmd是对共享内存段的操作方式,可选为 IPC_STAT,IPC_SET,IPC_RMID 。                                                                                        为IPC_RMID,表示删除共享内存段。这是buf填NULL即可。
                                                                               为IPC_STAT,表示获取共享内存的信息。buf用来存放共享内存的信息。
                                                                               为IPC_SET,表示设置。         
例1:共享内存的使用    
#include <sys/types.h>                                      //这三个是这一堆函数的头文件
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

#define SIZE 20
int main(int argc,char* argv[]){
        if(argc !=2){
                printf("error args\n");
                return -1;
        }
        key_t key= ftok(argv[1],1);                                    //根据传入的路径,产生key。同一个路径,产生同一个key。
        int shmid=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值