多进程实现共享内存的简单通信

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

进程1:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int id;
char *p;

void finish()
{
	shmdt(p);												//解除共享内存映射
	shmctl(id,IPC_RMID,NULL);								//删除共享内存
	printf("成功退出程序!\n");
	exit(0);												//退出程序
}

int main()
{
	signal(SIGINT,finish);
	int key = ftok("/home/jiajia", 900);					//申请一个键值
	id = shmget(key,2048,IPC_CREAT|IPC_EXCL|0777);			//申请一s个共享内存的ID
	if(id == -1)
	{
		if(errno == EEXIST)									//如果此ID的共享内存已存在
		{
			id = shmget(key,2048,0777);						//直接打开
		}
		else
		{
			perror("申请失败!\n");
			return -1;
		}
	}
	
	p = shmat(id, NULL, 0);									//映射共享内存
	bzero(p,2048);											//清空

	while(1)
	{
		printf("p1输入:");
		scanf("%s",p);										//往共享内存输入内容
	}
}

进程2:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int id;
char *p;

void finish()
{
	shmdt(p);
	shmctl(id,IPC_RMID,NULL);
	printf("成功退出程序!\n");
	exit(0);												//退出程序
	
}

int main()
{
	signal(SIGINT,finish);
	int key = ftok("/home/jiajia", 900);					//申请一个键值
	id = shmget(key,2048,IPC_CREAT|IPC_EXCL|0777);			//申请一s个共享内存的ID
	if(id == -1)
	{
		if(errno == EEXIST)									//如果此ID的共享内存已存在
		{
			id = shmget(key,2048,0777);						//直接打开
		}
		else
		{
			perror("申请失败!\n");
			return -1;
		}
	}
	
	p = shmat(id, NULL, 0);									//映射共享内存
	bzero(p,2048);											//清空

	while(1)
	{
		if(strlen(p)!= 0)									//如果共享内存内不为空
		printf("p2输出:%s\n",p);							//输出共享内存内容 
		bzero(p,2048);										//输出后再次清空
	}
}

你可能感兴趣的:(系统编程)