zoukankan      html  css  js  c++  java
  • 一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)


    各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信

    闲话休提。言归正转。让我们一起talk C栗子吧!

    共享内存是SystemV IPC结构这样的抽象概念的一种具体对象。就和它的名字一样,它提供了一段内存空间供不同的进程使用,进程之间能够通过该内存空间传递数据,进而实现进程间的通信。

    在介绍共享内存的用法之前,我们先介绍几个函数,这些函数都是用来操作共享的内存的。

    shmget函数

    int shmget(key_t key, size_t size,int shmflag)

    该函数用来获取共享内存。函数返回共享内存的标识符。我们能够通过该标识符使用共享内存;

    • 第一个參数是键值,通过它来操作IPC在内核中的结构。也就是共享内存在内核中的结构;(上一回中介绍过)
    • 第二个參数是共享内存的容量。单位是byte;
    • 第三个參数是共享内存的权限标记,该权限和文件权限一样;
    • 该函数执行成功时返回共享内存标识符。否则返回-1;

    在使用该函数的时候,我们须要自定义一个共享内存的类型,而且计算出该类型的内存空间。共享内存的类型能够根据程序须要来定义,常见的是定义一个结构体类型。

    shmat函数

    void * shmat(int shm_id, const void *shm_addr,int shmflg)

    该函数用来把共享内存连接到进程的地址空间中,这样进程就能够使用共享内存了。

    • 第一个參数是共享内存的标识符,通过shmget函数能够获得;
    • 第二个參数是一个地址,该地址表示共享内存连接到进程中的位置;
    • 第三个參数是一个位标记,仅仅有三个值供使用:SHM_RND,SHM_RDONLY还有0;
    • 该函数执行成功时返回指向共享内存第一个字节的指针,否则返回-1。

    在使用该函数的时候,第二个參数通常使用一个空指针,空指针表示让系统自己选择共享内存连接到进程地址空间的位置,这时第三參数能够使用SHM_RDONLY或者0。假设给第二个參数指定了地址。那么第三个參数须要使用SHM_RND。

    shmdt函数

    int shmdt(const void *shm_addr)

    该函数用来把共享内存从进程的地址空间中分离出来,分离以后进程就不能使用共享内存了;

    • 第一个參数是一个地址,它是共享内存第一个字节的指针,也就是shmat函数的返回值。
    • 该函数执行成功时返回0,否则返回-1;

    shmctl函数

    int shmctl(int shm_id, int cmd,struct shmid_ds *buf)

    该函数用来把共享内存连接到进程的地址空间中,这样进程就能够使用共享内存了;

    • 第一个參数是共享内存的标识符。通过shmget函数能够获得;
    • 第二个參数是一个命令。表示对共享内存的操作,仅仅有三个命令供使用:IPC_STAT,IPC_SET和IPC_RMID;
    • 第三个參数是一个结构体指针,该结构体中有共享内存的权限和全部者等信息。
    • 该函数执行成功时返回0,否则返回-1;

    我们通常使用该函数删除共享内存。这时候须要给第二个參数赋值为IPC_RMID,表示删除共享内存,第三參数能够为空指针。

    第二个參数的另外两个命令:

    • IPC_STAT表示把第三个參数中的内容和共享内存关联起来;
    • IPC_SET表示把第三个參数中的内容设置为共享内存的值。

    第三个參数的类型,我们在上一回中提起过,它和SystemV IPC的结构相似,除了必须有的成员外,它还有自己特有的成员。

    我从源码中找到了第三个參数的类型。具体的定义例如以下:(位于linux-4.0.3/include/linux/shm.h文件里)

    struct shmid_kernel /* private to the kernel */
    {       
            struct kern_ipc_perm    shm_perm;
            struct file             *shm_file;
            unsigned long           shm_nattch;
            unsigned long           shm_segsz;
            time_t                  shm_atim;
            time_t                  shm_dtim;
            time_t                  shm_ctim;
            pid_t                   shm_cprid;
            pid_t                   shm_lprid;
            struct user_struct      *mlock_user;
    
            /* The task created the shm object.  NULL if the task is dead. */
            struct task_struct      *shm_creator;
            struct list_head        shm_clist;      /* list by creator */
    };

    各位看官。关于使用共享内存进行进程间通信的样例咱们就讲到这里。

    欲知后面还有什么样例,且听下回分解 。


  • 相关阅读:
    【模板】常系数线性递推
    【模板】多项式除法
    【模板】多项式求逆
    codeblock的一个小问题
    IP分片浅析
    [LeetCode] Excel Sheet Column Number
    [LeetCode] Excel Sheet Column Title
    [LeetCode] Maximum Gap
    编程计算并输出1~n之间所有素数之和
    [LeetCode] Compare Version Numbers
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7026182.html
Copyright © 2011-2022 走看看