通过共享内存实现IPC

进程间通信 通过共享内存是一个概念,两个或多个进程可以访问公共内存。通信是通过共享内存完成的,其中一个进程所做的更改可以被另一个进程查看。

null

管道、fifo和消息队列的问题在于,两个进程之间需要交换信息。这些信息必须经过内核。

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

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

    使用的系统调用包括:

    ftok() :用于生成唯一密钥。

    shmget() :int shmget(键、大小、intshmflg);成功完成后,shmget()返回共享内存段的标识符。

    shmat() :在使用共享内存段之前,您必须连接自己 使用shmat()将其删除。void*shmat(int shmid,void*shmaddr,int shmflg); shmid是共享内存id。shmaddr指定要使用的特定地址,但我们应该设置 将其设置为零,操作系统将自动选择地址。

    shmdt() :处理完共享内存段后,程序应该 使用shmdt()将自身与它分离。int shmdt(无效*shmaddr);

    shmctl() :当您从共享内存中分离时,它不会被销毁。所以,摧毁 使用shmctl()。shmctl(int shmid,IPC_RMID,NULL);

    写入进程的共享内存

    #include <iostream>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    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" ,str);
    //detach from shared memory
    shmdt(str);
    return 0;
    }

    
    

    读卡器进程共享内存

    #include <iostream>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    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" ,str);
    //detach from shared memory
    shmdt(str);
    // destroy the shared memory
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
    }

    
    

    输出: 图片[1]-通过共享内存实现IPC-yiteyi-C++库

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享