欢迎来到天天文库
浏览记录
ID:44090251
大小:306.93 KB
页数:29页
时间:2019-10-18
《进程间通信方法总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、WPC-DWC-0000版本:V1.0进程间通信方法总结2012/12/23目录笫1章.文档说明1第2章.进程间通信概述1第3章.消息队列方法13.1.消息队列的基本概念13.2.消息队列的操作23.2.1.打开或创建消息队列23.2.2.读写消息队列33.3.消息队列应用实例6第4章.共享内存方法94.1.共享内存的基本概念94.2.共享内存的操作94.2.1.创建共亨内存10422.映射共享内存114.3.共享内存应用实例12第5章.管道方法165.1.管道的基本概念165.2.管道的操作175.3.管道应用实例17第6章.信号量方法196.1.信号量的棊本概念1962信号量的操作
2、196.3.信号量应用实例21第7章.小结23WirelessSystemLaboratory(WST),无线系统研究室第1章.文档说明本文档主要介绍进程之间通信的几种方法,并且通过Linux下C语言代码运行验证。第2章.进程间通信概述进程问通信就是在不同进程ZI'可传播或交换信息,那么不同进程ZI'可存在着什么双方都可以访问的介质呢?进程的用八空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所",所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。进程间通信的目的主要包括:•数据传输:一个进程需婆将它的数据发送给另一个
3、进程,发送的数据量在一个字节到几兆字节之间。•共亨数据:多个进程想要操作共亨数据,一个进程对共亨数据的修改,别的进程应该立刻看到。•通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。•资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。•进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所冇陷入和异常,并能够及时知道它的状态改变。进程间通信的方法主要有消息队列方法、共亨内存方法、管道方法、信号量等,本文主要介绍这儿种方法。第3章•消息队列方法3・1
4、•消息队列的基本概念消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级,木质就是内核地址空间中的内部链表。对消息队列冇写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列屮读走消息。消息队列是随内核持续的。每个消息队列都冇一个队列头,用结构structmsg_qucuc来描述。队列头中包含了该消息队列的大量信息,包括消息队列键值、用户ID、组ID、消息队列中消息数日等等,英至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。结构msg_queue如F,structmsg_queue{st
5、ruetkernipcpermqperm;timetq_stime;q_rtime;time_tq_ctime;unsignedlongq_cbytes;/*/*/*lastlastlast/*msgsndmsgrevchangecurrenttime*/time*/time*/numberofbytesonqueue*/unsignedlongqqnum;/*numberofmessagesinqueue*/unsignedlongq_qbytes;pid_tq_lspid;pid_tq_lrpid;/*maxnumberofbytesonqueue*//*pidoflastmsgs
6、nd*//*lastreceivepid*/structlist_hecidq_messages;struetlistheadq_receivers;struct};listheadq_senders;3.2.消息队列的操作对消息队列的操作只有三种方式。3.2.1.打开或创建消息队列消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可。3.2.1.1.msgget()简介为了创建一个新的消息队列,或者访问一个现有的队列,可以使用系统调用msgget()o使丿IJ格式:intmsgget(key_tkey,int
7、msgflg)msgget()的第一个变元是关键字的值。这个关键字的值将被拿来与内核中其他消息队列的现冇关键字值相比较。比较Z后,打开或者访问操作依赖于msgflg变元的内容。IPC_CREAT—如果在内核小不存在该队列,则创建它。IPC_EXCL—肖与IPC_CREAT—起使用时,如果队列早已存在则将出错。如果只使用了IPC_CREAT,msgget()或者返回新创建消息队列的消息队列标识符,或者会返回现冇的具冇同一个关键字值的队列的标识符。
此文档下载收益归作者所有