进程间通信之共享内存


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

发送端源代码:

#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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值