栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux:共享内存,消息队列

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux:共享内存,消息队列

共享内存

1.信号量的封装完成

#include
#include
#include
#include
#include
#include

union semun
{
	int val;
};
#define SEM1 MAX 3
#define SEM1 0
#define SEM1 1
#define SEM1 2

static int semid = -1;

void sem_init()
{
	int arr[SEM_MAX] = { 1,0,0 };//信号量初始值
	semid semget(key_t)1234, SEM_MAX, IPC_CREAT | IPC_EXCL | 0600);
	if (semid == -1)
	{
		semid = semget(key_t)1234, SEM_MAX, 0600);
		if (semif == -1)
		{
			printf("semget errn");
			return;
		}
	}
	else
	{
		union semun a;
		int i = 0;
		for (; i < SEM_MAX; i++)
		{
			a.val = arr[i];
			if (semctl(semid, i, SETVAL, a) == -1)
			{
				printf("semctl setval errn");
			}
		}
	}
}
void sem_p(int index)
{
	if (index < 0 || index >= SEM_MAX)
	{
		printf("index errn");
		return;
	}
	struct sembuf buf;
	buf.sem_num = index;
	buf.sem_op = -1;//p操作
	buf.sem_flg = SEM_UNDo;

	if (semop(semid, &buf, 1) == -1)
	{
		printf("semop p errn");
	}
}
void sem_v(int index)
{
	if (index < 0 || index >= SEM_MAX)
	{
		printf("index errn");
		return;
	}
	struct sembuf buf;
	buf.sem_num = index;
	buf.sem_op = 1;//v操作
	buf.sem_flg = SEM_UNDo;

	if (semop(semid, &buf, 1) == -1)
	{
		printf("semop p errn");
	}
}
void sem_destroy()
{
	if (semctl(semid, 0, IPC_RMID) == -1)
	{
		printf("sem destroy errn");
	}
}

创建-链接-断开链接-销毁(大部分情况下只进行前三个操作)
共享内存-基本上一定要用信号量


op:对向量值进行改变
创建信号量:samget
销毁:semctl
A进程和B进程不能使用同一块物理内存,如果要成为共享内存,首先要创建一块共享内存,然后把内存映射到A的地址空间中,再把它映射到B的地址空间之中.

消息队列

定义一个消息队列,可以添加消息,可以读取消息,如果消息队列为空,则我们不能读取消息,如果消息队列为满,则我们不能添加消息或者发送消息
创建消息,添加消息

获取消息

运行结果:

要收到所有消息吗,则把结果设置为0

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/277774.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号