美文网首页
进程间通信(6)-IPC通信之共享内存

进程间通信(6)-IPC通信之共享内存

作者: 3e1094b2ef7b | 来源:发表于2017-05-26 20:14 被阅读0次

    1、共享内存在内核中是什么样子的?

    它是一块缓存,类似于用户空间的数组或malloc函数分配的空间一样,只不过是在内核空间。

    2、共享内存的特点

    • 共享内存创建之后,一直存在于内核中,直到被删除或系统关闭;

    • 共享内存和管道不一样,读取后,内容仍在其共享内存中。

    3、 shmget函数:打开或创建共享内存

    shmget函数

    例1:通过IPC_PRIVATE创建共享内存

    #include "sys/types.h"
    #include "sys/shm.h"
    #include "signal.h"
    #include "unistd.h"
    #include "stdio.h"
    #include "stdlib.h"
    int main()
    {
        int shmid;
        shmid = shmget(IPC_PRIVATE,128,0777);
        if(shmid <0)
        {
            printf("creat share memory failure\n");
            return -1;
        }
        printf("create share memory success, shmid=%d\n", shmid);
        system("ipcs -m");
        // system("ipcrm -m shmid");
        return 0;
    }
    

    通过用户空间的ipcs命令,可以看到内核空间的ipc对象。

    ipcs:查看ipc对象
        ipcs -m:查看共享内存
        ipcs -q:查看消息队列
        ipcs -s:查看信号灯
    ipcrm:删除ipc对象
        ipcrm -m ID号:删除共享内存
        ipcrm -q ID号:删除消息队列
        ipcrm -s ID号:删除信号灯
    
    ipcrm -m ID号

    例2:通过ftok的返回值创建共享内存

    4、 ftok:创建key值

    char ftok(const char *path, char key)
    参数:第一个参数:文件路径和文件名;
         第二个参数:一个字符。
    返回值:正确返回一个key值,出错返回-1
    

    IPC_PRIVATE操作时,共享内存的key值都一样,都是0,所以使用ftok来创建key值。只要key值是一样的,用户空间的进程通过这个函数打开,则会对内核的同一个IPC对象操作。

    5、shmat:将共享内存映射到用户空间的地址中

    能不能用read ,write呢?
    为了方便用户空间对共享内存的操作,使用地址映射的方式。

    void *shmat(int shmid, const void *shmaddr, int shmflg);   //malloc
    参数:第一个参数:ID号;
         第二个参数:映射到的地址;NULL为系统自动完成的映射;
         第三个参数shmflg: SHM_RDONLY共享内存只读
                              默认是0,表示共享内存可读写。
    返回值:成功:映射后的地址;
    失败:NULL。
    

    6、shmdt:将进程(用户空间)里的地址映射删除。

    int shmdt(const void *shmaddr);
    参数:shmaddr共享内存映射后的地址
    返回值:成功:0
           出错:-1
    

    7、shmctl:删除共享内存对象(内核)

    函数原型:int shmctl(int shmid,  int cmd,  struct shmid_ds  *buf);
    函数参数:shmid:要操作的共享内存标识符。
             cmd : IPC_STAT  (获取对象属性)---  实现了命令ipcs -m
                    IPC_SET (设置对象属性)
                    IPC_RMID (删除对象)   ---实现了命令ipcrm -m
             buf :指定IPC_STAT/IPC_SET时用以保存/设置属性。
    函数返回值:成功:0
               出错:-1
    

    相关文章

      网友评论

          本文标题:进程间通信(6)-IPC通信之共享内存

          本文链接:https://www.haomeiwen.com/subject/vtgxfxtx.html