15_进程间通信6-共享存储

在这里插入图片描述

shmget() 分配一个System V共享内存段

NAME
分配一个System V共享内存段
       shmget - allocates a System V shared memory segment

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

/*
key:
如果没有亲缘关系的进程中 创建和获取 和之前 消息队列是一样的
如果在有亲缘关系的进程中,fork()之后,每一个子进程都可以拿到父进程创建的 key值,此时不再关心key值,此时可以设置为 IPC_PRIVATE,表示该IPC 为 匿名IPC 不需要ftok

size:要设置的共享内存的大小
shmflg : 当前共享内存创建的特殊要求,当key 为IPC_PRIVATE时, -semflg设置为IPC_CREAT
shmid = shmget(IPC_PRIVATE,MEMSIZE,IPC_CREAT|0600);
*/

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

RETURN VALUE
       On success, a valid shared memory identifier is returned.  On error, -1 is returned, and errno is set to indicate the error.

在这里插入图片描述


shmat()把共享内存映射过来
shmdt() 把共享内存进行解除映射

NAME
       shmat, shmdt - System V shared memory operations

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

/* 把共享内存映射过来
shmid:共享内存ID
shmaddr :需要映射到我当前空间的具体位置,写空 表示函数帮忙在当前进程空间中寻找一块可用的内存地址。
shmflg : 特殊要求,0为没有特殊要求
*/

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

//把共享内存进行解除映射
   int shmdt(const void *shmaddr);

RETURN VALUE
       On success, shmat() returns the address of the attached shared memory segment; on error, (void *) -1 is returned, and errno is set to indicate the cause  of  the
       error.

   On success, shmdt() returns 0; on error -1 is returned, and errno is set to indicate the cause of the error.

在这里插入图片描述
在这里插入图片描述


shmctl() System V共享内存控制 如销毁

NAME
System V共享内存控制  如销毁
       shmctl - System V shared memory control

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

/*
shmid,共享内存ID
cmd : 命令动作
如:IPC_RMID 销毁
buf,是否需要传参,需要传递的参数
*/
       int shmctl(int shmid, int cmd, struct shmid_ds *buf);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验:父子进程进 使用 共享内存 进行通信,对比之前使用内存映射mmap(),还是mmap()使用更简单一点。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <wait.h>
#define MEMSIZE 1024

int main()
{
	int shmid;
	pid_t pid;
	char *ptr;

	shmid = shmget(IPC_PRIVATE,MEMSIZE,IPC_CREAT|0600);
	if(shmid < 0)
	{
		perror("msgget");
		exit(1);
	}

	pid = fork();
	if(pid < 0)
	{
		perror("fork() failed");
		exit(1);
	}

	if(pid == 0)
	{
		ptr = shmat(shmid,NULL,0);
		if(ptr == (void *)-1)
		{
			perror("shmat");
			exit(1);
		}	
		
		strcpy(ptr,"Hello!");
		shmdt(ptr);
		exit(0);
	}
	else
	{
		wait(NULL);
		ptr = shmat(shmid,NULL,0);
		if(ptr == (void *)-1)
		{
			perror("shmat");
			exit(1);
		}
		puts(ptr);
		shmdt(ptr);
		shmctl(shmid,IPC_RMID,NULL);
		exit(0);
		
	}	

	exit(0);
	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值