- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章进程间通信讲解
7.5.2 映射 原型:int shmat ( int shmid, char *shmaddr, int shmflg); shmid:shmget函数返回的共享内存标识符 shmaddr:将共享内存映射到指定地址,(若为0:表示系统自动分配) flag:决定以什么方式来确定映射地址,通常为0,表示共享内存可读写 返回值:如果成功,则返回共享内存段连接到进程中的地址。如果失败,则返回- 1: errno = EINVAL (无效的IPC ID 值或者无效的地址) errno = ENOMEM (没有足够的内存) errno = EACCES (存取权限不够) 7.5.3 解除映射 当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。 系统调用:shmdt(); 调用原型:int shmdt ( char *shmaddr ); 返回值:如果失败,则返回- 1: errno = EINVAL (无效的连接地址) 脱离不等于删除,删除共享内存需要调用: shmctl(int shm_id,int command,struct shmid_ds *buf) Command:IPC_RMID 实例分析:shm1.c 7.6 消息队列 消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。 消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作。其中创建或打开消息队列使用的函数是msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制;添加消息使用的函数是msgsnd()函数,它把消息添加到已打开的消息队列末尾;读取消息使用的函数是msgrcv(),它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息;最后控制消息队列使用的函数是msgctl(),它可以完成多项功能。 消息队列 特点: 持续性:系统V消息队列是随内核持续的,只有在内核重启或者人工删除时,该消息队列才会被删除 键值:消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以要获得一个消息队列的描述字,必须提供该消息队列的键值。 key_t ftok(char *pathname,char proj) 返回文件名对应的键值 pathname:文件名,proj:项目名,不为0即可。 消息队列相比命名管道的优势在于它独立于发送和接收进程而存在,消除了同步命名管道的打开和关闭产生的问题。 7.6.1 消息队列-打开/创建 7.6.2 消息队列-发送消息 每个数据块都被认为含有一个类型,接收进程可以独立的接收含有不同类型值的数据块 7.6.3 消息队列-接收消息 7.6.4 消息队列-控制 struct msqid_ds{ uid_t msg_perm.uid; uid_t msg_perm.gid; mode_t msg_perm.mode; }; 消息对列举例 程序分析msg1.c msg2.c * * * sa_mask是一个包含信号集合的结构体,,该结构体内的信号表示在进行信号处理时,将要被阻塞的信号。 * * (1)Signal处理机制 #include signal.h void (*signal (int signo, void (*func)(int)))(int) 返回:成功则返回信号以前的处理配置,若出错则为SIG_ERR typedef void (*sighandler_t)(int) sighandler_t signal(int signum,sighandler_t handler) func的值是: (a)常数SIG_IGN:向内核表示忽略此信号(有两个信号SIGKILL和SIGSTOP不能忽略) (b)常数SIG_DFL:接到此信号后的动作是系统默认动作。 (c)当接到此信号后要调用的函数的地址:我们称此为捕捉此信号。我们称此函数为信号处理程序(signal handler)或信号捕捉函数(signal-catching function)。 实例分析 #include signal.h #include stdio.h #include stdlib.h void my_func(int sign_no) { if(sign_no==SIGINT) printf(I have get SIGINT\n); else if(sign_no==SIGQUIT) printf(I have get SIGQUIT\n); } int main()
文档评论(0)