05 Linux共享内存Demo

05 Linux共享内存Demo

作者 将狼才鲸
创建日期 2023-03-05

  • 运行结果:
jim@ubuntu:/mnt/hgfs/git_win10/many-repositories/21_Linux共享内存Demo$ make
gcc -o server test_sharememory_comm.c test_sharememory_server.c
gcc -o client test_sharememory_comm.c test_sharememory_client.c
jim@ubuntu:/mnt/hgfs/git_win10/many-repositories/21_Linux共享内存Demo$ make run
./server &
./client
server write: hello world!
client get: hello world!
jim@ubuntu:/mnt/hgfs/git_win10/many-repositories/21_Linux共享内存Demo$ 
  • 源码:
  1. Makefile
default:
	gcc -o server test_sharememory_comm.c test_sharememory_server.c
	gcc -o client test_sharememory_comm.c test_sharememory_client.c

run:
	./server &
	./client

clean:
	rm server; rm client;
  1. test_sharememory_comm.c
/******************************************************************************
 * \brief	Linux共享内存Demo
 * \note	须在Linux环境下编译,在MSYS2/MINGW环境下也会报错
 * \note	File format: UTF-8, 中文编码:UTF-8
 * \remarks	参考网址:[LINUX共享内存的创建与使用](https://blog.csdn.net/zzzAzl/article/details/122468102)
 * \author	将狼才鲸
 * \date	2023-03-05
 ******************************************************************************/

#include <stdio.h>		/* printf */
#include <sys/types.h>	/* key_t NULL */
#include "test_sharememory_comm.h"

#define SHM_PATH "./"	/* SHARE_MEMORY_PATH */
#define SHM_PROJECT_ID 1

static int get_sharememory_id(int size, int flag)
{
    
    
	/* 获取共享内存虚拟文件的标识号,参数一是路径名,参数二0~255自己取 */
	key_t key = ftok(SHM_PATH, SHM_PROJECT_ID);
	if (key < 0) {
    
    
		printf("get key error\n");
		return -1;
	}

	int id = shmget(key, size, flag);	/* 用指定权限为共享内存分配指定长度的连续空间 */
	if (id < 0) {
    
    
		printf("get id error\n");
		return -1;
	}

	return id;
}
 
int create_sharememory(int size)
{
    
    
	/* 创建共享内存并返回标识号,如果共享内存不存在则创建,
	   如果存在则报错,用户、组用户和其它用户具有读写权限 */
	return get_sharememory_id(size, IPC_CREAT | IPC_EXCL | 0666);
}

int get_sharememory(void)
{
    
    
	/* 获取共享内存标识号,如果共享内存不存在则创建,
	   如果存在返回该共享内存,用户、组用户和其它用户具有读写权限 */
	return get_sharememory_id(0, IPC_CREAT | 0666);
}

int destroy_sharememory(int id)
{
    
    
	/* 销毁共享内存 */
	return shmctl(id, IPC_RMID, NULL);
}
  1. test_sharememory_comm.h
#ifndef _TEST_SHAREMEMORY_COMM_H_
#define _TEST_SHAREMEMORY_COMM_H_

#include <sys/shm.h>	/* ftok shmget shmat */

#define SHARE_MEMORY_SIZE 4096

extern int create_sharememory(int size);
extern int get_sharememory(void);
extern int destroy_sharememory(int id);

#endif /* _TEST_SHAREMEMORY_COMM_H_ */

  1. test_sharememory_server.c
#include <stdio.h>	/* printf */
#include <string.h>	/* strcpy */
#include "test_sharememory_comm.h"

#define WRITE_STRING "hello world!"

int main()
{
    
    
	int shmid = create_sharememory(SHARE_MEMORY_SIZE);
	if (shmid < 0) {
    
    
		printf("create share memory error\n");
		return -1;
	}

	/* 映射共享内存,第二个参数非空则映射到该地址,第三个参数0表示可读写、SHM_RDONLY表示只读 */
	char *pshm = shmat(shmid, NULL, 0);
	if (!pshm) {
    
    
		printf("link share memory error\n");
		return -1;
	}

	/* 向共享内存中写入内容;
	   共享内存不存在队列、先入先出或者缓存,它就是一块内存 */
	strcpy(pshm, WRITE_STRING);
	printf("server write: %s\n", WRITE_STRING);

	shmdt(pshm);	/* 解除共享内存的映射 */

	return 0;
}

  1. test_sharememory_client.c
#include <stddef.h>	/* NULL */
#include <stdio.h>	/* printf */
#include "test_sharememory_comm.h"

int main()
{
    
    
	int shmid = get_sharememory();
	if (shmid < 0) {
    
    
		printf("get share memory error\n");
		return -1;
	}
	
	/* 映射共享内存,第二个参数非空则映射到该地址,第三个参数0表示可读写、SHM_RDONLY表示只读 */
	char *pshm = shmat(shmid, NULL, 0);
	if (!pshm) {
    
    
		printf("link share memory error\n");
		return -1;
	}
	
	/* 读取共享内存中的内容,或者直接操作该内存指针;
	   共享内存不存在队列、先入先出或者缓存,它就是一块内存 */
	printf("client get: %s\n", pshm);

	shmdt(pshm);	/* 解除共享内存的映射 */

	destroy_sharememory(shmid);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq582880551/article/details/129341472
05
今日推荐