通过共享内存进行进程间通信是一个概念,其中两个或多个进程可以访问公共内存。并通过此共享内存进行通信,在该共享内存中,一个进程进行的更改可以被另一进程查看。
管道,fifo和消息队列的问题–是两个进程交换信息的问题。信息必须经过内核。
- 服务器从输入文件读取。
- 服务器使用管道,FIFO或消息队列将这些数据写入消息中。
- 客户端从IPC通道读取数据,再次要求将数据从内核的IPC缓冲区复制到客户端的缓冲区。
- 最后,从客户端的缓冲区复制数据。
总共需要四个数据副本(2个读取和2个写入)。因此,共享内存通过让两个或多个进程共享一个内存段提供了一种方法。使用共享内存,数据仅复制两次-从输入文件复制到共享内存,从共享存储器复制到输出文件。
使用的系统调用为:
ftok(): is use to generate a unique key.
shmget(): int shmget(key_t,size_tsize,intshmflg); upon successful completion, shmget() returns an identifier for the shared memory segment.
shmat(): Before you can use a shared memory segment, you have to attach yourself
to it using shmat(). void *shmat(int shmid ,void *shmaddr ,int shmflg);
shmid is shared memory id. shmaddr specifies specific address to use but we should set
it to zero and OS will automatically choose the address.shmdt(): When you’re done with the shared memory segment, your program should
detach itself from it using shmdt(). int shmdt(void *shmaddr);shmctl(): when you detach from shared memory,it is not destroyed. So, to destroy
shmctl() is used. shmctl(int shmid,IPC_RMID,NULL);共享存储过程
#include
#include #include #include using namespace std; int main() { // ftok to generate unique key key_t key = ftok("shmfile",65); // shmget returns an identifier in shmid int shmid = shmget(key,1024,0666|IPC_CREAT); // shmat to attach to shared memory char *str = (char*) shmat(shmid,(void*)0,0); cout<<"Write Data : "; gets(str); printf("Data written in memory: %s\n",str); //detach from shared memory shmdt(str); return 0; } 共享内存以实现阅读过程
#include
#include #include #include using namespace std; int main() { // ftok to generate unique key key_t key = ftok("shmfile",65); // shmget returns an identifier in shmid int shmid = shmget(key,1024,0666|IPC_CREAT); // shmat to attach to shared memory char *str = (char*) shmat(shmid,(void*)0,0); printf("Data read from memory: %s\n",str); //detach from shared memory shmdt(str); // destroy the shared memory shmctl(shmid,IPC_RMID,NULL); return 0; } 输出:
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。