进程间通信-共享内存实例

//shmdata.h
struct shm_st
{
	int flag; //0可读不可写,1可写不可读
	char text[BUFSIZ];
};

 

 

 

//shmwrite.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shmdata.h"
#include <memory.h>

int main()
{
	void* writeAbc;
	int shmId;

	shmId = shmget(123, sizeof(struct shm_st), 0666|IPC_CREAT);
	if(shmId < 0)
	{
		perror("shmget");
		return -1;
	}
	writeAbc = shmat(shmId, NULL, 0);
	if((void*)-1 == writeAbc)
	{
		perror("shmat");
		return -1;
	}
	while(1)
	{
		if(1 == ((struct shm_st*)writeAbc)->flag)
		{
			memset(((struct shm_st*)writeAbc)->text, 0, BUFSIZ);
			printf("please intput content to write to share memory\r\n");
			scanf("%s", ((struct shm_st*)writeAbc)->text);
			((struct shm_st*)writeAbc)->flag = 0;
			if(0 == strcmp("quit", ((struct shm_st*)writeAbc)->text))
			{
				break;
			}
		}

		sleep(2);
	}
	if(shmdt(writeAbc) < 0)
	{
		perror("shmdt");
		return -1;
	}
	
	return 0;
}

 

 

 

 

//shmread.c
#include <stdio.h>
#include "shmdata.h"
#include <sys/ipc.h>
#include <sys/shm.h>

int main()
{
	void* readAbc;
	int shmId;
	shmId = shmget(123, sizeof(struct shm_st), 0666|IPC_CREAT);
	if(shmId < 0)
	{
		perror("shmget");
		return -1;
	}
	readAbc = shmat(shmId, NULL, 0);
	while(1)
	{
		if(0 == ((struct shm_st*)readAbc)->flag)
		{
			printf("%s\r\n", ((struct shm_st*)readAbc)->text);
			if(0 == strcmp("quit", ((struct shm_st*)readAbc)->text))
			{
				break;
			}
			((struct shm_st*)readAbc)->flag = 1;
		}

		sleep(2);
	}
	if(shmdt(readAbc) < 0)
	{
		perror("shmdt");
		return -1;
	}
	if(shmctl(shmId, IPC_RMID, NULL) < 0)
	{
		perror("shmctl");
		return -1;
	}
	
	return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值