共享内存写入程序,通过信号量控制公共区域。为公共区域枷锁。
#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 版权协议,转载请附上原文出处链接和本声明。