此次给大家分享的是Linux下通过共享内存,实现进程间的通信,流程如下:
创建写进程,其功能为创建共享内存并映射到私有地址空间,然后向内存写入数据,直至遇到’#’为止,读进程使用和写进程相同的KEY创建共享内存并映射到私有地址空间,然后从内存读数据并打印在终端上。
write.c
#include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { int written; char text[TEXT_SZ]; }; #endif int main() { void *shm = NULL; struct shared_use_st *shared = NULL; char buffer[TEXT_SZ+1]; int shmid = shmget(ftok(".",'a'), sizeof(struct shared_use_st),0666|IPC_CREAT); if(shmid==-1) { perror("shmget failed"); exit(1); } shm = shmat(shmid,(void*)0,0); if(shm == (void*)-1) { perror("shamt failed"); exit(1); } shared = (struct shared_use_st*)shm; do{ while(shared->written==1) { sleep(1); printf("Waiting...\n"); } printf("Enter some text:"); fgets(buffer,TEXT_SZ,stdin); strncpy(shared->text,buffer,TEXT_SZ); shared->written = 1; }while(strncmp(buffer,"#",1)!=0); if(shmdt(shm) == -1) { perror("shmdt failed\n"); exit(1); } exit(0); }
read.c
#include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { int written; char text[TEXT_SZ]; }; #endif int main() { void *shm = NULL; struct shared_use_st *shared; int shmid=shmget(ftok(".",'a'),sizeof(struct shared_use_st),0666|IPC_CREAT); if(shmid==-1) { perror("shmget failed"); exit(1); } shm = shmat(shmid,(void*)0,0); if(shm == (void*)-1) { perror("shamt failed"); exit(1); } shared = (struct shared_use_st*)shm; do { if(shared->written != 0) { printf("read:%s",shared->text); sleep(rand()%3); shared->written = 0; if(strncmp(shared->text,"#",1) == 0) break; } else sleep(1); }while(1); if(shmdt(shm) == -1) { perror("shmdt failed\n"); exit(1); } exit(0); }
在两个终端中分别打开read和write后在write中输入信息,read中显示:
输入#后 write和read退出:
创建了一个结构体用于存储读写数据text[]和同步信号量written,创建共享内存时用shmget(ftok(".",'a'),sizeof(struct shared_use_st),0666|IPC_CREAT),ftok(“.”,’a’)起到一个媒介的作用,两个没有关系的内存,通过ftok()输入相同的参数得到相同的共享内存的键值。