• 共享内存通讯


    共享内存通讯

    10.1 创建/获取共享内存

    10.1.1 函数名

    shmget

    10.1.2 函数原形

    Int shmget(key_t key,size_t size,int shmflg)

    10.1.3 函数功能

    创建或者获取共享内存,并返回其描述符ID

    10.1.4 所属头文件

    <sys/ipc.h>

    <sys/shm.h>

    10.1.5 返回值

    成功:返回创建或则获取到的共享内存的描述符

    失败:-1

    10.1.6 参数说明

    Key:共享内存的键值

    Size:共享内存的大小

    Shmflg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存

    10.2 映射共享内存

    10.2.1 函数名

    shmat

    10.2.2 函数原形

    Void *shmat(int shmid,const void *shmaddr,int shmflg)

    10.2.3 函数功能

    shmid指定的共享内存映射到进程的地址空间里

    10.2.4 所属头文件

    <sys/types.h>

    <sys/shm.h>

    10.2.5 返回值

    成功:返回映射到进程空间之后的内存地址

    失败:-1

    10.2.6 参数说明

    Shmid:要映射的共享内存的描述符

    Shmaddr:指定映射之后的地址,但是一般情况都让该参数为NULL,表明让linux系统自动的选择映射地址

    Shmflg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存

    10.3 脱离共享内存

    10.3.1 函数名

    shmdt

    10.3.2 函数原形

    int shmdt(const void *shmaddr)

    10.3.3 函数功能

    从进程地址空间中断掉与共享内存的联系

    10.3.4 所属头文件

    <sys/types.h>

    <sys/shm.h>

    10.3.5 返回值

    成功:1

    失败:-1

    10.3.6 参数说明

    Shmaddr:要断开的共享内存的映射地址

    10.4 删除共享内存

    10.4.1 函数名

    shmctl

    10.4.2 函数原形

    Int shmctl(int shmid,int cmd,struct shmid_ds *buf)

    10.4.3 函数功能

    控制共享内存

    10.4.4 所属头文件

    <sys/ipc.h>

    <sys/shm.h>

    10.4.5 返回值

    成功:根据不同的操作返回不同的值

    失败:-1

    10.4.6 参数说明

    Shmid:要控制的共享内存的id

    Cmd:决定执行什么样的控制操作,如IPC_RMID(表示删除)

    Buf:获取linux中描述共享内存的shmid_ds结构,基本不使用

    例程:

    share_mem_write.c

     1 #include <stdio.h>
     2 #include <sys/types.h>
     3 #include <sys/shm.h>
     4 #include <sys/ipc.h>
     5 #include <unistd.h>
     6 #include <stdlib.h>
     7 
     8 #define TEXT_SZ 2048
     9 struct shared_use_st
    10 {
    11     int written_by_you;
    12     char some_text[TEXT_SZ];
    13 };
    14 
    15 int main()
    16 {
    17     int shmid;
    18     int running = 1;
    19     struct shared_use_st *shared_stuff;
    20     char buffer[TEXT_SZ];
    21     //1.创建共享内存
    22     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
    23     if(1 == shmid)
    24     {
    25         printf("create share memory fail.
    ");
    26         exit(EXIT_FAILURE);
    27     }
    28     //2.映射共享内存
    29     shared_stuff = (struct shared_use_st *)shmat(shmid, NULL , 0);
    30     //3.循环
    31     while(running)
    32     {
    33         //判断共享内存的数据是否读走
    34         while(shared_stuff->written_by_you == 1)
    35         {
    36             sleep(1);
    37             printf("wait read process!
    ");
    38         }
    39         //3.1获取用户输入
    40         fgets(buffer,TEXT_SZ,stdin);
    41 
    42         //3.2将用户输入的字符串放入共享内存
    43         strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
    44         shared_stuff->written_by_you = 1;
    45 
    46         if(strncmp(buffer,"end",3) == 0)
    47         {
    48             running = 0;
    49         }
    50     }
    51     //4.脱离共享内存
    52     shmdt((const void*)shared_stuff);
    53     return 0;
    54 }
    55 
    56 share_mem_write.c

    share_mem_read.c

     1 #include <stdio.h>
     2 #include <sys/types.h>
     3 #include <sys/shm.h>
     4 #include <sys/ipc.h>
     5 #include <unistd.h>
     6 #include <stdlib.h>
     7 
     8 #define TEXT_SZ 2048
     9 struct shared_use_st
    10 {
    11     int written_by_you;
    12     char some_text[TEXT_SZ];
    13     
    14 };
    15 int main()
    16 {
    17     int shmid;
    18     int running =1;
    19     struct shared_use_st *shared_stuff;
    20     //1.创建/获取共享内存
    21     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
    22 
    23     //2.映射共享内存
    24     shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,0);
    25 
    26     //3.循环
    27     while(running)
    28     {
    29         //打印共享内存
    30         if(shared_stuff->written_by_you == 1)
    31         {
    32             printf("write process write %s
    ",shared_stuff->some_text);
    33             shared_stuff->written_by_you = 0;
    34             if(strncmp(shared_stuff->some_text,"end",3) == 0)
    35             {
    36                 running = 0;
    37             }
    38         }
    39     }
    40     //4.脱离共享内存
    41     shmdt((const void *)shared_stuff);
    42 
    43     //5.删除共享内存
    44     shmctl(shmid,IPC_RMID,0);
    45     return 1;
    46 }
    47 
    48 share_mem_read.c
  • 相关阅读:
    Hystrix使用说明,配置参数说明
    服务限流 -- 自定义注解基于RateLimiter实现接口限流
    Java生产环境下问题排查
    Java垃圾回收(GC)机制详解
    RabbitMQ如何解决各种情况下丢数据的问题
    JWT如何在Spring Cloud微服务系统中在服务相互调时传递
    LeetCode 117th Weekly Contest 总结
    系统设计总结
    单调栈总结
    LeetCode 116th Weekly Contest 总结
  • 原文地址:https://www.cnblogs.com/love-linux/p/5223845.html
Copyright © 2020-2023  润新知