1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程通信.ppt

信号量 信号量创建和引用的模式,与消息队列类似。 UNIX提供的信号量机制是信号量组,允许一次创建多个信号量和一次操作多个信号量。 使用信号量时,程序需要首先根据KEY(类似文件名),使用semget()系统调用创建一个新的信号量组或者获取一个已存在的信号量组,得到一个内部的信号量组的ID(类似fd)。 独立启动的多个进程可以根据事先约定好的相同的KEY得到id,以访问同一个信号量组。 semctl()可以用来查询信号量的状态,还用来删除不再使用的信号量组。 * 信号量 要调用的第一个函数是semget()以获得一个信号量ID * #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int flag); 成功返回信号量ID; 出错返回-1 参数key是信号量组的KEY。 参数nsems指明信号量组中包含有多少个信号量,这个参数仅在创建新信号量组时使用,获取已存在的信号量组,将这个参数设为0。 信号量 这个系统调用可以查询信号量组的状态,删除信号量组。 * #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl(int sem_id, int snum, int cmd, void *arg); 出错返回-1 参数cmd是控制命令号,参数snum是信号量在信号量组中的编号,arg是执行这一控制命令所需要的参数存放区。 信号量 最重要的一个系统调用,对信号量施行P操作或者V操作,可能会导致调用进程在此睡眠。 * int semop(int sem_id, struct sembuf sops[], int nsops);? 出错返回-1 参数sem_id为信号量组的ID,是semget()的返回值。 数组sops可以指定多个操作,数组的每个元素是一个结构体,描述需要进行什么操作。 参数nsops说明这个数组中有多少个有效元素。 信号量 sembuf描述了对信号量的一个操作,结构定义如下: * struct sembuf { short sem_num; /* 信号量在信号量组中的编号,从0开始编号 */ short sem_op; /* 信号量操作 */ short sem_flg; /* 操作选项 */ };? sem_num指出要操作的这一信号量在信号量组中的编号,按照C语言的惯例,编号从0开始。 sem_op指出需要进行的信号量操作。 P操作相当于执行sem_op=-1的操作;V操作相当于执行sem_op=1的操作。 共享内存 共享内存(share memory)就是多个进程共同使用同一段物理内存空间。 同消息队列相比,使用共享内存在多个进程之间传送数据,速度更快。尤其是进程之间传送的数据量很大时,效果明显。 但是,共享同一物理内存段的多个进程之间,必须自行解决对共享内存访问的互斥和同步问题。UNIX操作系统本身并不自动解决这些问题。 * 共享内存 前面介绍的消息队列自动实现了收发进程的数据缓冲,如果使用共享内存完全代替消息队列的功能在多个进程之间传送数据,需要增加信号量在多进程之间实现互斥。程序编制起来要复杂得多。 * 共享内存 共享内存还可以用在许多其他的应用中: 例如:进程可以使用共享内存向动态产生的数量不固定的多个查询进程发布数据,这有点类似广播。 再如,通信协议处理程序把当前的通信状态和统计信息放入共享内存中,这样,在通信协议处理程序运行过程中,可以随时启动另外一个监视程序,从共享内存中读取数据以窥视协议有限状态机当前状态和统计信息,了解通信状况。监视程序可以随时终止,监视程序的运行与否对通信进程毫无影响。协议程序需要做的惟一配合就是将本来就放在内存中的数据,放到共享内存中,除了可以被其他进程读写外,速度上也不会受任何影响。 * 共享内存 在Windows和其他的多任务操作系统中,也都提供共享内存机制,基本功能是一样的,在函数格式上有些不同。 与共享内存相关的一组系统调用函数的体系,类似于消息队列和信号量组的系统调用 * #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int shmget(key_t key, int nbytes, int flag); 成功返回共享内存段ID; 出错返回-1 共享内存 使用共享内存段时,程序需要首先根据KEY使用shmget()系统调用创建一

文档评论(0)

yyh2000710 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档