共享内存及信号量控制实例

  • Post author:
  • Post category:其他


共享内存写入程序,通过信号量控制公共区域。为公共区域枷锁。

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
#include <fcntl.h>

typedef struct{
	char name[8];
	int age;
} people;

const int num = 3;

//创建共享内存
int createShm(people* &p_map);

int main(int argc, char** argv)
{
	people *p_map;
	int i;
	//创建共享内存
	createShm(p_map);
	
	/*创建信号量*/
	sem_t *mutex;
	mutex = sem_open("shm",O_CREAT,0644,1);

	while(1)
	{
		/*加锁P*/
		sem_wait(mutex);	
		for(i=0; i<num; i++)
		{
			strcpy((p_map+i)->name,"1234567\0");		
			(p_map+i)->age=0+i;
		}
		sleep(2);
		/*解锁V*/
		sem_post(mutex);
	}
	
	//清理共享内存
	shmdt(p_map) ;	
	return 0 ;
}

int createShm(people* &p_map)
{
	int shm_id,i;
	key_t key;
//char pathname[30] ;
//strcpy(pathname,".") ;	
//key = ftok(pathname,0x03);
//if(key==-1)
//{
//	//上一个函数发生错误的原因输出到标准设备
//	perror("ftok error");
//	return -1;
//}
//printf("key=%d\n",key) ;
	
	//创建一个共享内存对象,第一个key参数也可以通过ftok获取
	shm_id=shmget(0x1112, sizeof(people)*num, IPC_CREAT|IPC_EXCL|0600);
	if(shm_id==-1)
	{	
		perror("shmget error");		
		return -1;	
	}	
	printf("shm_id=%d\n", shm_id);	
	//把共享内存区对象映射到调用进程的地址空间
	p_map=(people*)shmat(shm_id,NULL,0);
	return 1;
}

共享内存读程序,通过信号量控制公共区域。为公共区域枷锁。

#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>

typedef struct{
char name[8];
int age;
} people;
 
const int num = 3;
int createShm(	people *&p_map);

int main(int argc, char** argv)
{
	people *p_map;
	int i;
	
	createShm( p_map);
	
	/*创建信号量*/
	sem_t *mutex;
	mutex = sem_open("shm",0,0644,0);

	while(1)
	{
		/*加锁P操作*/
		sem_wait(mutex);
				
		for(i=0;i<num;i++)
		{
			printf( "name:%s\n",(*(p_map+i)).name );
			printf( "age %d\n",(*(p_map+i)).age );
		}
		sleep(2);

		/*解锁v操作*/
		sem_post(mutex);	
	}
	
	if(shmdt(p_map) == -1)
	{
		perror("detach error");	
		return -1;
	}

	return 0;
}

int createShm(people *&p_map)
{
	int shm_id;
	key_t key;
//	char pathname[30] ;
//	strcpy(pathname,".") ;
//	key = ftok(pathname,0x03);
//	if(key == -1)
//	{
//		perror("ftok error");
//		return -1;
//	}
	
	shm_id = shmget(0x1112,0, 0);
	if(shm_id == -1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shm_id=%d\n", shm_id);
	p_map = (people*)shmat(shm_id,NULL,0);
	return 1;			
}

makefile

CC=g++ -g

#SRCS=shmwrite.c
SRCS=shmread.c

OBJS=$(SRCS:.c=.o)

#PROGRAM=shmwrite
PROGRAM=shmread

LIB = -lpthread

RM=rm

$(PROGRAM):$(OBJS)
	$(CC) -o $(PROGRAM) $(OBJS) $(LIB)

$(OBJS):$(SRCS)
	$(CC) -c $(SRCS)

.PHONY:clean
clean:
	$(RM) $(OBJS) $(PROGRAM)



版权声明:本文为Leeboy_Wang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。