共享內存使用的函數介紹html
int shmget(key_t key, size_t size, int shmflg);函數
void *shmat(int shm_id, const void *shm_addr, int shmflg);ui
int shmdt(const void *shm_addr);spa
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);.net
shmid_ds結構至少包含如下成員:unix
struct shmid_ds {指針
uid_t shm_perm.uid;code
uid_t shm_perm.gid;htm
mode_t shm_perm.mode;blog
}
#include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h> typedef struct stu { char name[32]; int age; } STU; int main(int argc, char *argv[]) { int shmid; shmid = shmget((key_t)1234,sizeof(STU),IPC_CREAT | 0666); if (shmid == -1) { printf("shmget failed\n"); exit(1); } STU *p; p = shmat(shmid,NULL,0); if (p == (void*)-1) { printf("shmat failed\n"); exit(1); } strcpy(p->name, "zhangsan"); p->age = 20; while(1) { if(memcmp(p, "quit",4) == 0) { break; } } shmdt(p); shmctl(shmid,IPC_RMID,NULL); return 0; }
shmread.c
#include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> typedef struct stu { char name[32]; int age; } STU; int main(int argc, char *argv[]) { int shmid; shmid = shmget((key_t)1234,0,0); if (shmid == -1) { printf("shmget failed\n"); exit(1); } STU *p; p = shmat(shmid,NULL,0); if (p == (void*)-1) { printf("shmat failed\n"); exit(1); } printf("name = %s, age = %d\n",p->name,p->age); memcpy(p,"quit",4); shmdt(p); return 0; }
Makefile
.PHONY: clean all CC=gcc CFLAGS=-Wall -g BIN=shmwrite shmread all:$(BIN) %.o:%.c $(cc) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(bin)
參考:http://blog.chinaunix.net/uid-26000296-id-3421346.html