首页 > 编程语言 > 详细

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

时间:2016-01-10 10:30:05      阅读:213      评论:0      收藏:0      [点我收藏+]

各位看官们,大家好,上一回中咱们说的是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 */
};

各位看官,关于使用共享内存进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


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

原文:http://blog.csdn.net/talk_8/article/details/50491214

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!