• 嵌入式Linux--进程间通信--共享内存


    1.

    回顾之前的通信内容:

    进程间通信主要有5种通信方式

            1、无名管道(只能单向发送或接收)

            2、命名管道(同上)

            3、消息队列(可以发送,也能接收消息)

            4、共享内存(有一块公共内存shm可挂载A\B上)

            5、信号

            6、信号量(不作为进程间通信的方式,控制一个临界资源)
     

    2.共享内存:

    原理步骤:

            1、创建/打开共享内存——shmget

            2、映射——shmat

            3、数据交换——写入(strcpy),读取(p指针指向内存空间,print(p))

            4、释放共享内存——shmdt

            5、干掉共享内存——shmctl
    API:


    #include
     
     
    //1.创建或获取一个共享内存:成功返回共享内存id,失败返回-1
    int shmget(key_t key, size_t size, int flag);
     
    //2.连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
    void *shmat(int shm_id, const void *addr, int flag);
     
    //3.断开与共享内存的连接:成功返回0,失败返回-1
    int shmdt(void *addr);
     
    //4.控制共享内存的相关信息:成功返回0,失败返回-1
    int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
     

    写入实施方法:

    1. int *p=共享内存

    2.         printf("%s",p);//读取内存数据

    3.         strcpy("p","data");//向共享内存写入数据

    3.代码:

    shmw.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int shmid;
    9. char *shmaddr;
    10. key_t key;
    11. key = ftok(".",2580);
    12. shmid = shmget(key,1024*1,IPC_CREAT|0700);
    13. if(shmid == -1){
    14. printf("shmget creat failure\n");
    15. exit(-1);
    16. }
    17. shmaddr = shmat(shmid,0,0);
    18. strcpy(shmaddr,"Qing Yuan handsome!");
    19. sleep(3);
    20. shmdt(shmaddr);
    21. shmctl(shmid,IPC_RMID,0);
    22. printf("quit\n");
    23. return 0;
    24. }

    shmr.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int shmid;
    9. char *shmaddr;
    10. key_t key;
    11. key = ftok(".",2580);
    12. shmid = shmget(key,1024*4,IPC_CREAT|0777);
    13. if(shmid == -1){
    14. printf("shmget creat failure\n");
    15. exit(-1);
    16. }
    17. shmaddr = shmat(shmid,0,0);
    18. printf("message is %s\n",&shmaddr);//两个代码区别,读取是直接从指针地址里读取内容
    19. shmdt(shmaddr);
    20. shmctl(shmid,IPC_RMID,0);
    21. printf("quit\n");
    22. return 0;
    23. }

    结果:

  • 相关阅读:
    获取操作系统信息服务器信息JVM信息cpu内存磁盘信息
    CSS学习(3)-浮动和定位
    vulnhub之Ripper
    C语言动态内存管理
    4.从中缀向后缀转换表达式
    【面试刷题】——堆栈窗口
    Java,集合框架,关于Collection接口(子接口List和Set)
    Scala的集合操作之可变数组和不可变数组,可变List集合与不可变List集合,可变Set与不可变Set操作,可变和不可变Map集合和元组操作
    SQL之exists、not exists
    jupyter使用的一个奇怪bug——SyntaxError: invalid non-printable character U+00A0
  • 原文地址:https://blog.csdn.net/Herry_z/article/details/133151404