第2章 进程管理4-进程通信解析.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程通信 在进程之间进行信息交换,包括传递信号和数据。 Linux无名管道通信 若只触发某些行为,软中断信号机制简捷有效。 若进程间需交换数据? ---- 管道 管道:用“管道”将读写进程连接在一起,写进程将数据从写入端写入,读进程将数据从读出端读出。数据量大小是系统定义的最大缓冲区字节数。 创建和使用无名管道的系统调用 1. 创建管道 格式: int pipe( int fp[2] ); 返回:0 --- 正确返回,-1 ---- 错误返回 参数:fp[1]为写入端,fp[0]为读出端 功能:创建一个无名管道fp,fp[1]用于写,fp[0]用于读。 2. 读写管道----借助文件机制 格式:写管道 write( fp[1], buf, size ); 读管道 read( fp[0], buf, size ); 参数:buf为数据缓冲区;size为l读写长度。 头文件:unistd.h 管道通信示例1 main() { int p1, fd[2] ; char outpipe[50], inpipe[50]=“This is a message from child.”; pipe(fd); p1=fork(); if (p1==0) write(fd[1],inpipe,50); //写信息到管道 else if (p10); { wait(0); //等待子进程终止 read(fd[0],outpipe,50); //从管道读信息 printf(%s\n,outpipe); } } 管道通信示例2 main() { int p1, fd[2] ; char str1[50], str2[50]; pipe(fd); p1=fork(); 子进程执行的分支 父进程执行的分支 } 管道通信示例2执行结果分析 修改管道通信示例2 无名管道通信机制特点 管道中的数据是字符流,工作于单向通信方式; 管道逻辑上是由系统在内存中创建的临时文件实现的,物理上则由文件系统的高速缓冲区构成; 无名管道只能供创建管道的进程及其子孙进程共享; 管道为临界资源,各进程对管道的访问既有同步又有互斥,需要用户自己借助同步互斥机制以及文件机制来实现对管道的访问! Linux消息缓冲队列 1.创建或获取消息队列 格式:int msgget ( key_t key, int msgflag ); 功能:创建或获取标识为key的消息队列,并返回队列描述符。 返回:正确返回该消息队列的描述符msgid;错误返回-1。 参数: key—消息队列标识符,为正整数。可由用户指定(适用于不同进程家族);也可使用IPC_PRIVATE由系统产生key值(适用于同一进程家族); msgflag—标志或访问方式,由操作权限和控制命令进行或运算得到。 操作权限:用户可读0400 小组可读0040 其他可读0004 用户可写0200 小组可写0020 其他可写0002 控制命令:IPC_CREAT(值0001000),若队列不存在则创建。 2.对消息队列的控制 格式:int msgctl( int msgid, int cmd, struct msqid_ds *buf ); 功能:查询、设置消息队列的状态;撤消消息队列。 返回:函数调用成功返回0,不成功返回-1。 参数: msgid—该消息队列的描述符; cmd—规定命令的类型: IPC_STAT 查询消息队列状态,将消息队列的msqid_ds复制到buf; IPC_SET 设置或修改消息队列状态,设置有效用户、组标识、操作允许权、字节数; IPC_RMID 撤消描述符为msgid的消息队列; buf—含有控制参数或查询结果的用户缓冲区的地址,可为0。 3.发送消息 格式:int msgsnd( int msgid, struct msgbuf*msgp, int size, int flag); 功能:将msgp-msgbuf中的消息复制到msgid消息队列中,将之挂到队尾,唤醒等待消息的进程。 参数:msgid—执行msgget()返回的消息队列的描述符; msgp—待发送的消息; size—由msgp指向的数据结构中消息长度; flag—规定当消息队列满时应执行的动作,例如:若在fl

文档评论(0)

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

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

1亿VIP精品文档

相关文档