首先我们需要一个 shm_com.h
#ifndef _SHM_COM_H_ #define _SHM_COM_H_ #define TEXT_SZ 2048 struct shared_use_st { int written_by_you; char some_text[TEXT_SZ]; }; #endif /* _SHM_COM_H */
然后是 shm1.cpp
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include "shm_com.h" int main() { int running = 1; void* shared_memory = (void *)0; struct shared_use_st* shared_stuff; int shmid; srand((unsigned int)getpid()); shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } shared_memory = shmat(shmid, (void *)0, 0); if (shared_memory == (void *)-1) { perror("shmat"); exit(EXIT_FAILURE); } printf("Memory attached at %X\n", (int)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; shared_stuff->written_by_you = 0; while (running) { if (shared_stuff->written_by_you) { printf("You wrote: %s", shared_stuff->some_text); sleep(rand() % 4); shared_stuff->written_by_you = 0; if (strncmp(shared_stuff->some_text, "end", 3) == 0) { running = 0; } } } if (shmdt(shared_memory) == -1) { perror("shmdt"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, 0) == -1) { perror("shmctl"); exit(EXIT_FAILURE); } return 0; }
然后是 shm2.cpp
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include "shm_com.h" int main() { int running = 1; void* shared_memory = (void *)0; struct shared_use_st* shared_stuff; char buffer[TEXT_SZ]; int shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666); if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } shared_memory = shmat(shmid, (void *)0, 0); if (shared_memory == (void *)-1) { perror("shmat"); exit(EXIT_FAILURE); } printf("Memory attached at %X\n", (int)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; while (running) { while (shared_stuff->written_by_you == 1) { sleep(1); printf("waiting for client...\n"); } printf("Enter some text: "); fgets(buffer, TEXT_SZ, stdin); strncpy(shared_stuff->some_text, buffer, TEXT_SZ); shared_stuff->written_by_you = 1; if (strncmp(buffer, "end", 3) == 0) { running = 0; } } if (shmdt(shared_memory) == -1) { perror("shmdt"); exit(EXIT_FAILURE); } return 0; }
编译一下
g++ -g -Wall shm1.cpp -o shm1.exe g++ -g -Wall shm2.cpp -o shm2.exe
就可以运行了
——————————————————————–
2013-03-28 20:04:11 update:注意 shmdt 和 shmctl 两种方式结束共享内存是不同的,shmdt 只是当前进程脱离共享内存,不对内存造成其他影响,而 shmctl 方式是删除这片内存,那样的话,其他的进程就再也无法 attach 这片内存了(已经 attach 上的可以继续)用,但是系统会把这片内存标记为 dest