进程间通信之共享内存


此程序实现两个普通进程间通过共享内存来进行通信,共享内存能够进行大数据量的通信,这一点事消息队列无法比拟的。在这里同时使用了信号量来保证两个进程间的读写同步。

发送端源代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <string.h>
int main()
{
	
	key_t key,key1;
	int running=1;
	int shmid;
	int semid;
	int value;
	void *sharem=NULL;
	struct sembuf sem_b;
	sem_b.sem_num=0;
	sem_b.sem_flg=SEM_UNDO;
	key=ftok(".",12324);
	if((semid=semget(key,1,IPC_CREAT|0777))==-1)
	{
		perror("semget");
		exit(1);
	}
	if(semctl(semid,0,SETVAL,0)==-1)
	{
		perror("semctl");
		if(semctl(semid,0,IPC_RMID,0)==-1)
		{
			perror("semctl()");
			exit(1);
		}
		exit(1);
	}
	printf("sem init sucessful!\n");
	key1=ftok(".",1254);
	if((shmid=shmget(key1,2000,IPC_CREAT|SHM_R|SHM_W))==-1)
	{
		perror("shmget");
		exit(1);
	}
	if((sharem=shmat(shmid,NULL,0))==NULL)
	{
		perror("shmat");
		if(shmctl(shmid,IPC_RMID,NULL)==-1)
			perror("shmctl");
		exit(1);
	}
	while(running)
	{
		if((value=semctl(semid,0,GETVAL))==0)
		{
			printf("write data operate\n");
			printf("please input something\n");
			char buffer[512]="";
			fgets(buffer,512,stdin);
			strcpy((char*)sharem,buffer);
			sem_b.sem_op=1;
			if(semop(semid,&sem_b,1)==-1)
			{
				perror("semop");
				exit(1);
			}
			if(!strncmp(buffer,"end",3))
			{
				printf("the process will exit");
				running=0;
			}
		}
	}
	sleep(10);
	return 0;
}


 

 

 

接收端源代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <string.h>
int main()
{
	
	key_t key,key1;
	int running=1;
	int shmid;
	int semid;
	int value;
	void *sharem=NULL;
	struct sembuf sem_b;
	sem_b.sem_num=0;
	sem_b.sem_flg=SEM_UNDO;
	key=ftok(".",12324);
	if((semid=semget(key,1,IPC_CREAT|0777))==-1)
	{
		perror("semget");
		exit(1);
	}
	/*
	if(semctl(semid,0,SETVAL,0)==-1)
	{
		perror("semctl");
		if(semctl(semid,0,IPC_RMID,0)==-1)
		{
			perror("semctl()");
			exit(1);
		}
		exit(1);
	}*/
	printf("sem init sucessful!\n");
	key1=ftok(".",1254);
	if((shmid=shmget(key1,2000,IPC_CREAT|SHM_R|SHM_W))==-1)
	{
		perror("shmget");
		exit(1);
	}
	if((sharem=shmat(shmid,NULL,0))==NULL)
	{
		perror("shmat");
		if(shmctl(shmid,IPC_RMID,NULL)==-1)
			perror("shmctl");
		exit(1);
	}
	while(running)
	{	
		if(semctl(semid,0,GETVAL)==1)
		{
				printf("receive data operate\n");
				char buffer[512]="";
				strcpy(buffer,(char*)sharem);
				printf("the receive data is:%s\n",buffer);
				sem_b.sem_op=-1;
				if(semop(semid,&sem_b,1)==-1)
				{	
					perror("semop");
					exit(1);
				}
				if(0==strncmp(buffer,"end",3))
				{
					running =0;
					printf("the process will exit\n");
				}
		}
		//printf("");	
	}
	shmdt(sharem);
	if(shmctl(shmid,IPC_RMID,0)==-1)
	{
		perror("shmctl");
		exit(1);
	}
	if(semctl(semid,IPC_RMID,0)==-1)
	{
		perror("semctl");
		exit(1);
	}
	return 0;
}


 

在Linux下,进程间通信的一种方式是通过共享内存实现的。共享内存允许两个或多个进程共享一定的存储区,这样它们就可以直接访问同一块内存区域,而不需要进行数据的复制。共享内存是一种高效的进程间通信方式,因为数据直接写入内存,不需要多次数据拷贝,所以传输速度很快\[2\]。 在使用共享内存进行进程间通信时,需要给共享内存创建一个唯一的身份ID,以便区分不同的共享内存。当进程需要访问共享内存时,需要在映射时带上这个ID,这样就可以确定访问的是哪一个共享内存\[3\]。 需要注意的是,共享内存并没有提供同步机制,也就是说,在一个进程结束对共享内存的写操作之前,并没有自动机制可以阻止另一个进程开始对它进行读取。为了实现多个进程共享内存的同步访问,通常会使用信号量来实现共享内存的同步访问控制\[2\]。 总结起来,Linux下的共享内存是一种高效的进程间通信方式,允许多个进程共享一块存储区。通过给共享内存创建唯一的身份ID,可以区分不同的共享内存。然而,共享内存并没有提供同步机制,需要使用信号量来实现共享内存的同步访问控制\[2\]\[3\]。 #### 引用[.reference_title] - *1* *3* [Linux多进程间通信——共享内存实现](https://blog.youkuaiyun.com/zhm1949/article/details/124909541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Linux下进程间通信方式——共享内存](https://blog.youkuaiyun.com/xujianjun229/article/details/118584955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值