快捷搜索:
来自 67677新澳门手机版 2019-11-01 10:16 的文章
当前位置: 67677新澳门手机版 > 67677新澳门手机版 > 正文

音信队列,Linux下进度间通讯

试验内容

进程通信的邮箱方式由操作系统提供形如 send()和 receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统本身提供的信箱,分析两者之间存在的异同。

1.socket

  新闻队列

  • 什么样是消息队列
    音信队列提供了意气风发种从多个进度向另一个经过发送多个数据块的点子。 每一种数据块都被感觉包罗二个档案的次序,采取进度可以单独地抽出含有不相同品种的数据结构。我们得以经过发送消息来幸免命名管道的一齐和围堵难题。但是音信队列与命名管道相似,种种数据块都有一个最大尺寸的约束。
    Linux用宏MS土霉素AX和MSGMNB来约束一条音信的最大尺寸和叁个行列的最大尺寸。

  • Linux中怎么着利用信息队列
    Linux提供了生机勃勃雨后玉兰片音讯队列的函数接口来让大家有益地选拔它来兑现进程间的通讯。它的用法与其他多个System V PIC机制,即频限信号量和分享内部存款和储蓄器相近。

    • msgget()函数
      该函数用来成立和做客三个音讯队列。它的原型为:
      int msgget(key_t key, int msgflg);
      它回到多个以key命名的音讯队列的标记符(非零整数),失利时再次回到-1.
    • msgsnd()函数
      该函数用来把消息增添到音讯队列中。它的原型为:
      int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
      假使调用成功,音讯数据的意气风发份别本将被平放音信队列中,并重临0,战败时再次来到-1.
    • msgrcv()函数
      该函数用来从三个新闻队列获撤销息,它的原型为:
      int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
      调用成功时,该函数再次回到见到选择缓存区中的字节数,音信被复制到由msg_ptr指向的客户分配的缓存区中,然后删除新闻队列中的对应新闻。战败时重返-1。
    • msgctl()函数
      该函数用来支配音信队列,它与分享内部存款和储蓄器的shmctl函数雷同,它的原型为:
      int msgctl(int msgid, int command, struct msgid_ds *buf);
      打响时再次来到0,战败时回来-1.

多少个历程能够用kill发送频限信号至此外三个进程。

  分享内部存款和储蓄器

  • 什么样是分享内部存款和储蓄器
    看名就会知道意思,分享内部存款和储蓄器就是同意七个不相干的历程访问同四个逻辑内存。分享内部存款和储蓄器是在五个正在运转的长河之间分享和传递数据的大器晚成种相当实用的办法。差别进度之间分享的内部存款和储蓄器常常安插为同少年老成段物理内部存款和储蓄器。进程能够将长期以来段分享内部存款和储蓄器连接到它们本人之处空间中,全数进度都能够访问分享内部存款和储蓄器中之处,就恍如它们是由用C语言函数malloc()分配的内部存款和储蓄器相似。而只要某些进度向分享内部存款和储蓄器写入数据,所做的退换将立时影响到能够访谈同生机勃勃段分享内部存款和储蓄器的别的其余进度。
    特意提示:分享内部存款和储蓄器并未有提供一块机制,也正是说,在第叁个进程截至对分享内存的写操作以前,并无机关机制得以阻止第二个经过带头对它进行读取。所以大家日常要求用任何的机制来一同对共享内部存款和储蓄器的拜会,举例后面聊到的信号量。
  • 分享内存的施用
    与时限信号量同样,在Linux中也提供了大器晚成组函数接口用于接收分享内部存款和储蓄器,并且动用分享共存的接口还与时限信号量的不得了相仿,并且比选用连续信号量的接口来得轻巧。它们申明在头文件 sys/shm.h 中。
    • shmget()函数
      该函数用来创设分享内部存款和储蓄器,它的原型为:
      int shmget(key_t key, size_t size, int shmflg);
      建功立业时回来贰个与key相关的分享内部存储器标记符(非负整数),用于后续的分享内部存款和储蓄器函数。调用战败再次回到-1.
    • shmat()函数
      第一遍创造完分享内存时,它还不能够被其余进度访谈,shmat()函数的效应正是用来运转对该分享内部存款和储蓄器的拜会,并把分享内部存款和储蓄器连接到当前路程的地点空间。它的原型如下:
      void *shmat(int shm_id, const void *shm_addr, int shmflg);
      打响时回来二个对准分享内部存款和储蓄器第一个字节的指针,如若调用退步再次来到-1.
    • shmdt()函数
      该函数用于将分享内部存款和储蓄器从当前历程中分离。注意,将分享内存剥离实际不是去除它,只是使该分享内部存款和储蓄器对当前进度不再可用。它的原型如下:
      int shmdt(const void *shmaddr);
      调用成功时再次回到0,失利时再次来到-1.
    • shmctl()函数
      与时域信号量的semctl()函数同样,用来决定分享内部存款和储蓄器,它的原型如下:
      int shmctl(int shm_id, int command, struct shmid_ds *buf);

5.音信队列

背景知识

5.音讯队列

  总体代码

  Linux-interProcessCommunication
  假如对您有扶植点个star吧(●'◡'●)

平时用mkfifo来创立。若无表明管道是非阻塞的,那么三个为读张开的管道将卡住直到有进程为写展开此FIFO。类似若是为写展开的管道将阻塞直到有进度为读打开此FIFO。

写在后面

唯其如此说,Deadline果真是第一生产力。可是做出来的事物确实是心怀叵测,于是又花了大器晚成凌晨海重机厂写代码。


用shmget函数到手一块内存,并用shmat设置为允许本进度使用那块分享内部存款和储蓄器。使用完事后用shmdt删除内部存款和储蓄器块。

  信号量

  • 怎样是非非确定性信号量
    为了幸免现身因三个程序同时做客三个分享能源而引发的生龙活虎层层难点,我们须要大器晚成种艺术,它能够透过改变并选取令牌来授权,在任不常刻只可以有二个举办线程访问代码的围拢区域。临界区域是指实践多少更新的代码须求独自据有式地实践。而信号量就可以提供这样的风流倜傥种访谈机制,让四个临界区同一时间唯有三个线程在做客它,也正是说非时限信号量是用来调协进程对分享财富的访问的。
  • Linux的能量信号量机制
    Linux提供了黄金时代组专心设计的连续信号量接口来对时域信号量举办操作,它们不不过指向二进制复信号量,上面将会对那个函数举办介绍,但请在乎,那么些函数都以用来对成组的实信号量值进行操作的。它们注明在头文件sys/sem.h中。
    • semget()函数
      它的职能是创制多个新时域信号量或获得贰个原来就有信号量,原型为:
      int semget(key_t key, int num_sems, int sem_flags);
      水到渠成重回叁个相应复信号标记符(非零),战败再次来到-1.
    • semop()函数
      它的效应是改造频限信号量的值,原型为:
      int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
    • semctl()函数
      该函数用来直接决定期域信号量音信,它的原型为:
      int semctl(int sem_id, int sem_num, int command, ...);

4.分享内部存款和储蓄器

  参谋资料

  以上资料全套源于以下网址:

  • Linux进度间通讯(五):实信号量 semget()、semop()、semctl()
  • Linux进程间通讯(六):分享内存shmget()、shmat()、shmdt()、shmctl()
  • Linux进程间通讯(七):新闻队列 msgget()、msgsend()、msgrcv()、msgctl()

2.管道满含无名管道适用于老爹和儿子进度,命名管道)

  实验结果

  • 消息队列
    图片 1
  • 随机信号量 分享内部存款和储蓄器
    图片 2

Linux下进度间通讯大约有以下两种:

  总结

  • 不足

    • 从未有过图形化界面
    • 用时域信号量和分享内部存款和储蓄器完结的历程通讯只可以发送数字消息
    • 创造分享内部存款和储蓄器空间时,设置权限为了方便设置为0666( 各样进度可读和可写),应该要安装user只好读而不可能写,other只好写而不可能读
    • 音讯队列未有测量检验msgrcv()函数通过转移msgtype参数来改造选取优先级。
      > msgtype 可以落成生龙活虎种轻易的接纳优先级。若是msgtype为0,就获取队列中的第一个新闻。假如它的值大于零,将赢得具备肖似新闻类型的率先个音信。假若它小于零,就获得项目等于或小于msgtype的相对值的第一个音信。

    • ...

  • 三种办法贯彻进度间通讯的争论

    • 异:消息队列没有需求实信号量来决定同步和倾轧难点,并且可以很便利的校勘选取优先级,而分享内部存储器则只好简单的抽出定时间排序的音信。
    • 同:多少个过程选取到的新闻都和另三个进程发送的毫无二致。
  • 心得
    • 由于Linux提供的时域信号量接口函数都以指向黄金时代组非确定性信号量进行操作的,由此参数中山大学部都急需钦点对生龙活虎组中的哪一个确定性信号量进行操作
    • 共享内部存款和储蓄器只寄放音讯缓存区,至于信箱头的这几个值依然寄放在分别进程中。

如有不足,应接指正!

1.socket

4.分享内部存款和储蓄器

本文由67677新澳门手机版发布于67677新澳门手机版,转载请注明出处:音信队列,Linux下进度间通讯

关键词: