Linux下共享内存简单程序示例

 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的通信方式效率是非常高的。

简单程序示例:

/*write.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include "data.h"

#define BUFLEN 1024

int main(int argc, char **argv)
{
	int shmid;
	key_t shmkey;
	char *shmptr;
	Student *std;
	shmkey = ftok("./client.c", 1);
	shmid = shmget(shmkey, BUFLEN, 0666|IPC_CREAT);//创建共享内存块
	if (shmid == -1)
	{
		printf("shmget failed!\n");
		exit(1);
	}
	shmptr = (char*)shmat(shmid, NULL, 0);//映射到本地进程地址
	if ((int)shmptr == -1)
	{
		printf("shmat failed!\n");
		exit(1);
	}
	
	std = (Student*)shmptr;
	memset(std, 0, sizeof(Student));
	printf("input age and name:\n");
	scanf("%d %s", &std->age, std->name);
	return 0;		
}

/*read.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include "data.h"

#define BUFLEN 1024

int main(int argc, char **argv)
{
	int shmid;
	key_t shmkey;
	char *shmptr;
	Student *std;
	shmkey = ftok("./client.c", 1);
	shmid = shmget(shmkey, BUFLEN, 0666|IPC_CREAT);//创建共享内存块
	if (shmid == -1)
	{
		printf("shmget failed!\n");
		exit(1);
	}
	shmptr = (char*)shmat(shmid, NULL, 0);//映射到本地进程地址
	if ((int)shmptr == -1)
	{
		printf("shmat failed!\n");
		exit(1);
	}
	std = (Student*)shmptr;
	printf("%d,%s\n", std->age, std->name);
	shmdt(shmptr);//删除映射
	shmctl(shmid, IPC_RMID, NULL);//删除共享内存块
	return 0;		
}

#makefile
CC = gcc
CFLAGS = -Wall -g
TARGET = write read

all:$(TARGET)
write:write.o
		$(CC) $(CFLAGS) -o $@ $^
read:read.o
		$(CC) $(CFLAGS) -o $@ $^
%.o:%.c
		$(CC) $(CFLAGS) -c -o $@ $<
.PHONE:clean
clean:
		rm -f *.o $(TARGET)

/*data.h*/
#ifndef _DATA_H_
#define _DATA_H_

#define SIZE 20
typedef struct/*共享内存数据结构*/
{
	int age;
	char name[SIZE];
}Student;

#endif


 

调试的时候先运行write,写内存,然后再运行read读取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存屏障是一种机制,用于确保多线程并发访问共享内存时的一致性。在 Linux 内核中,有多种内存屏障的类型和使用方法,其中包括: 1. 读屏障(read barrier):确保所有之前的读操作完成后再进行后续的读操作。 2. 写屏障(write barrier):确保所有之前的写操作完成后再进行后续的写操作。 3. 全屏障(full barrier):确保所有之前的读和写操作都完成后再进行后续的读和写操作。 下面是一个使用内存屏障的示例,假设有两个线程同时访问一个共享变量: ```c #include <stdio.h> #include <pthread.h> #include <stdatomic.h> atomic_int shared_variable = 0; void* thread_function(void* arg) { int i; for (i = 0; i < 1000000; i++) { // 使用内存屏障确保多线程访问的共享变量一致性 atomic_thread_fence(memory_order_seq_cst); shared_variable++; atomic_thread_fence(memory_order_seq_cst); } return NULL; } int main() { pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_function, NULL); pthread_create(&thread2, NULL, thread_function, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Shared variable value: %d\n", shared_variable); return 0; } ``` 在这个示例中,每个线程对共享变量执行 1000000 次自增操作。在每次自增操作之前和之后,使用内存屏障确保多线程访问的共享变量一致性。最后,主线程输出共享变量的最终值。 需要注意的是,内存屏障的使用应该根据具体的场景和需求来选择合适的类型和位置。不正确的内存屏障使用可能会导致性能下降或者程序出现错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值