引用头文件
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <ctype.h>
#define SHMSIZE 1024
创建共享内存
int open_shm(key_t key_val)
{
int shmid;
if((shmid=shmget(key_val, SHMSIZE, IPC_CREAT|IPC_EXCL|0666))==-1)
{
printf("Shared memory segment exists. \n");
if((shmid=shmget(key_val, SHMSIZE, 0))==-1)
{
perror("shmget");
exit(1);
}
}
else
{
printf("Creating new shared memory segment. \n");
}
return shmid;
}
写到共享内存
void writeshm(int shmid, void* segptr, char * text)
{
printf("write text length: %d \n", strlen(text));
strcpy((char*)segptr, text);
strncpy((char*)segptr, text, strlen(text));
printf("Done...");
}
读取共享内存
void readshm(int shmid, void* segptr)
{
printf("segptr:%s \n", (char*)segptr);
}
删除共享内存
void removeshm(int shmid)
{
shmctl(shmid, IPC_RMID, 0);
printf("Shared memory deleted \n");
}
修改共享内存
void changemode(int shmid, char* mode)
{
struct shmid_ds myshm_ds;
shmctl(shmid, IPC_STAT, &myshm_ds);
printf("Old permissions were: %o \n", myshm_ds.shm_perm.mode);
sscanf(mode,"%o", &myshm_ds.shm_perm.mode);
shmctl(shmid, IPC_SET, &myshm_ds);
printf("New permissions are : %o \n", myshm_ds.shm_perm.mode);
}
key_t key;
int shmid;
void* segptr
printf("argc =%d \n ", argc);
if(argc==1) usage();
key=ftok(".", 'S');
if((shmid=open_shm(key))==-1)
{
perror("shmget");
exit(1);
}
printf("Creat shm ok \n");
if((segptr=shmat(shmid, 0, 0))==(void *)-1)
{
perror("shmat");
exit(1);
}
printf("shmat ok \n");
switch(tolower(argv[1][0]))
{
case 'w':
writeshm(shmid, segptr, argv[2]);
break;
case 'r':
readshm(shmid, segptr);
break;
case 'd':
removeshm(shmid);
break;
case 'm':
changemode(shmid, argv[2]);
break;
default:
usage();
}
Makefile
EXEC = shm_creat
OBJS = shm_creat.o
SRC = shm_creat.c
CC = g++
#LD = arm-linux-ld
CFLAGS += -O2 -Wall
LDFLAGS +=
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS)
%.o:%.c
$(CC) $(CFLAGS) -c {1}lt; -o $@
clean:
rm -vf $(EXEC) *.o *~