各位看官们,大家好,上一回中咱们说的是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语言实例--使用共享内存进行进程间通信一)的更多相关文章

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

    各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...

  2. Linux Linux程序练习十五(进程间的通信共享内存版)

    /* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进 ...

  3. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)

    各位看官们,大家好,上一回中咱们说的是使用消息队列进行进程间通信的样例.这一回咱们接着上一回的内容继续说使用消息队列进行进程间通信.闲话休提.言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...

  5. 一起talk C栗子吧(第九十 三回:C语言实例--进程间通信之临界资源)

    各位看官们.大家好,前面章回中咱们说的是使用信号和管道进行进程间通信的样例.这一回咱们说的样例是:进程间通信之临界资源.闲话休提,言归正转.让我们一起talk C栗子吧! 我们首先介绍一下,什么是临界 ...

  6. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  7. [你必须知道的.NET]第二十五回:认识元数据和IL(中)

    发布日期:2009.02.25 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 书接上回[第二十四回:认识元数据和IL(上)], ...

  8. 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

    各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...

  9. 一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)

    各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间 ...

随机推荐

  1. sigprocmask和信号阻塞

    注意阻塞和忽略,是有区别的. 阻塞只是暂时的,忽略是就没了. 参数:how:用于指定信号修改的方式,可能选择有三种:SIG_BLOCK //加入信号到进程屏蔽.SIG_UNBLOCK //从进程屏蔽里 ...

  2. java-集合类(二)

    使用场景 1.多线程 (1)在jdk1.5之前原始的集合类中,仅仅有vector.stack.hashtable.enumeration等是线程安全的,其它的都是非线程安全的. 非线程安全的集合在多线 ...

  3. 使用dispatch_once实现单例

    很多人实现单例会这样写: @implementation XXClass + (id)sharedInstance { static XXClass *sharedInstance = nil; @s ...

  4. Oracle 10g RAC (linux) ASM 共享存储的管理详解

    ---------ASM 的管理(共享磁盘的管理)1.以 instance 的方式管理 ASM,启动 database 之前必须先启动 ASM instance,ASM instance 启动后,挂载 ...

  5. [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)

    题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...

  6. CSS3个人盲点总结【总结中..........】

    ~:表示同辈元素之后指定类型的元素,如;elm1 ~ elm2表示,elm1之后的所有elm2元素,且elm1与elm2都是在同一个父级元素. +:表示同辈元素的兄弟元素. \A:一个空白换行符 &l ...

  7. WIN32常用

    //1.设置窗口大小 MoveWindow(hWnd, , , + , + , FALSE); //放在InitInstance用于设置位置与窗口大小 //传递句柄就可以绘图 //2.双缓冲绘图模式 ...

  8. iOS开发-Tools-CocoaPods

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...

  9. png库结合zlib库使用出现的一个链接问题的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 要使用png库,首先得编译png库,要编译png库,得依赖zlib库的头文件.在使用png库读取一个png文件时,代码 ...

  10. (转载)15 个 Android 通用流行框架大全

    15 个 Android 通用流行框架大全 时间:2017-03-20 11:36来源:未知 作者:admin 点击: 2089 次 15 个 Android 通用流行框架大全   1. 缓存 Dis ...