📜  通过共享内存进行IPC

📅  最后修改于: 2021-05-25 19:39:34             🧑  作者: Mango

通过共享内存进行进程间通信是一个概念,其中两个或多个进程可以访问公共内存。并通过此共享内存进行通信,在该共享内存中,一个进程进行的更改可以被另一进程查看。

管道,fifo和消息队列的问题–是两个进程交换信息的问题。信息必须经过内核。

  • 服务器从输入文件读取。
  • 服务器使用管道,FIFO或消息队列将这些数据写入消息中。
  • 客户端从IPC通道读取数据,再次要求将数据从内核的IPC缓冲区复制到客户端的缓冲区。
  • 最后,从客户端的缓冲区复制数据。

    总共需要四个数据副本(2个读取和2个写入)。因此,共享内存通过让两个或多个进程共享一个内存段提供了一种方法。使用共享内存,数据仅复制两次-从输入文件复制到共享内存,从共享存储器复制到输出文件。

    使用的系统调用为:

    共享存储过程

    #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基础课程》。