linux 共享内存 简单例子

一般流程:

1. 使用key_t ftok(const char*pathname,  int proj_id) 创建键值

2. 使用int shmget(key_t key, size_t size, int shmflg) 创建共享内存

3. 使用int shmat(int shmid, const void *shmaddr, int shmflg) 获取共享内存地址

4. 使用int shmdt(const void *shmaddr) 删除内存

此外 可使用 shmctl(int shmid, int cmd, struct shmid_ds *buf) 标记要删除的内存


简单例子:(出自linux网络编程)


#include <stdio.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <string.h>
static char msg[]="你好,共享内存!";

typedef int sem_t;

union semun{
	int   val;
	struct semid_ds *buf;
	unsigned short  *arry;
}arg;

sem_t CreateSem(key_t key,  int value)
{
	union semun sem;
	sem_t semid;
	sem.val = value;
	
	semid = semget(key, 1, IPC_CREAT|0660);
	if (semid == -1)
	{
		printf("create error!");
		return -1;
	}

	semctl(semid, 0, SETVAL, sem);   // 发出命令 建立value个初始值信号量

	return semid;
}

int Sem_P(sem_t semid)
{
	struct sembuf sops = {0, +1, IPC_NOWAIT};
	return (semop(semid,  &sops, 1));
}

int Sem_V(sem_t semid)
{
	struct sembuf sops = {0, -1, IPC_NOWAIT};
	return (semop(semid,  &sops, 1));
}

int GetvalueSem(sem_t semid)
{
	union semun sem;
	sem.val = 0;
	return semctl(semid, 0, GETVAL, sem);
	
}

void DestroySem(sem_t semid)
{
	union semun sem;
	sem.val = 0;
	semctl(semid, 0, IPC_RMID, sem);
}


int main(void)
{
	key_t key;
	int semid, shmid;
	char i, *shms, *shmc;
	struct semid_ds buf;
	int value = 0;
	char buffer[80];
	pid_t p;

	key = ftok("./server.c", 'a');
	shmid = shmget(key, 1024, IPC_CREAT|0660);  // 获得共享内存,大小为1024个字节
	semid = CreateSem(key,0);    // 创建信号量 实现互斥访问

	p = fork();
	if (p > 0)
	{
		shms = (char*)shmat(shmid, 0,0);
		memcpy(shms, msg, strlen(msg)+1);
		sleep(10);
		Sem_P(semid);
		shmdt(shms);

		DestroySem(semid);
	}
	else if (p == 0)
	{
		shmc = (char*)shmat(shmid, 0,0);
		Sem_V(semid);
		printf("Memory:%s\n", shmc);
		shmdt(shmc);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值