进程间同步和通信.ppt
《进程间同步和通信.ppt》由会员分享,可在线阅读,更多相关《进程间同步和通信.ppt(37页珍藏版)》请在三一文库上搜索。
1、进程间同步和通信,xlanchen2007.6.25,xlanchen2006.6.21,Embedded Operating Systems,2,进程间通信,IPC,Inter-Process Communication Unix系统提供的基本的IPC包括: 1、管道和FIFO(有名管道) 2、消息 3、信号量 4、共享内存区 5、套接字,xlanchen2006.6.21,Embedded Operating Systems,3,1、管道(pipe),管道是所有Unix都提供的一种IPC机制 管道是半双工的,数据只能向一个方向流动; 一个进程将数据写入管道, 另一个进程从管道中读取数据 数
2、据的读出和写入: 写入的内容每次都添加在管道缓冲区的末尾, 每次都是从缓冲区的头部读出数据。 需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);,xlanchen2006.6.21,Embedded Operating Systems,4,在shell中使用管道的例子,命令:“ls | more” 使用pipeline “|”将两个命令”ls”和“more”连接起来,使得ls的输出成为more的输入 也可以使用如下的两个命令 命令1:“ls tmp” 命令2:”more tmp” 命令1把ls的输出重定向到tmp文件中; 命令2把more的输入重定向
3、到tmp文件,xlanchen2006.6.21,Embedded Operating Systems,5,创建一个管道,管道可看成是被打开的文件,但并没有真实的 文件与之对应 pipe()系统调用用来创建一个新的管道 #include int pipe(int filedes2); 管道两端分别用描述符filedes0和filedes1描述 管道两端的功能是固定的: filedes0只能用于读,称为管道读端; filedes1只能用于写,称为管道写端。 若试图从写端读,或者向读端写都将导致错误发生。 一般文件的I/O函数都可用于管道,如close、read、write等。,xlanchen2
4、006.6.21,Embedded Operating Systems,6,使用管道的典型程序,testpipe.c 管道只能在具有亲缘关系的进程之间进行通信 通过fork传递管道的描述符 任意的两个进程不可能共享同一个管道 无法打开已经存在的管道,xlanchen2006.6.21,Embedded Operating Systems,7,FIFO,管道的一个重大限制是它没有名字,因此 只能用于具有亲缘关系的进程间通信,在 有名管道(named pipe或FIFO)提出后, 该限制得到了克服。 FIFO,有名管道 特殊的文件类型: 1,严格遵循先入先出的读写规则 2,类似管道,在文件系统中不
5、存在数据块,而是与一块内核缓冲区相关联 3,有名字,FIFO的名字包含在系统的目录树结构中,可以按名访问,xlanchen2006.6.21,Embedded Operating Systems,8,FIFO的操作: 以及:open,close,read,write等普通文件操作,xlanchen2006.6.21,Embedded Operating Systems,9,FIFO举例,创建一个FIFO:createfifo.c 向FIFO写:writefifo.c 从FIFO读:readfifo.c,xlanchen2006.6.21,Embedded Operating Systems,1
6、0,createfifo.c,xlanchen2006.6.21,Embedded Operating Systems,11,writefifo.c,xlanchen2006.6.21,Embedded Operating Systems,12,readfifo.c,xlanchen2006.6.21,Embedded Operating Systems,13,2、消息队列,消息队列就是一个消息的链表。 可以把消息看作一个记录,具有特定的格式以及特定的优先级。 对消息队列有写权限的进程可以按照一定的规则向消息队列添加新消息; 对消息队列有读权限的进程则可以从消息队列中读走消息。,xlanche
7、n2006.6.21,Embedded Operating Systems,14,消息队列的创建 int msgget(key_t key, int msgflg) 根据给定的键值,返回对应的消息队列 若能找到,则返回已有的;否则,创建一个新的,xlanchen2006.6.21,Embedded Operating Systems,15,发送消息 int msgsnd(int msqid, /目标消息队列 struct msgbuf *msgp, /待发送的消息 int msgsz, /消息的大小 int msgflg); /标志 对于发送消息来讲,msgflg有意义的标志为 IPC_NOW
8、AIT:指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待,xlanchen2006.6.21,Embedded Operating Systems,16,接收消息 int msgrcv(int msqid, /msqid为消息队列描述字 struct msgbuf *msgp, /消息返回后存储这里 int msgsz, /指定消息内容的长度 long msgtyp, /请求读取的消息类型 nt msgflg); 读消息标志msgflg可以为以下几个常量的或: IPC_NOWAIT:如果没有满足条件的消息,立即返回,此时,errno=ENOMSG IPC_EXCEPT:与ms
9、gtyp0配合使用,返回队列中第一个类型不为msgtyp的消息 IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。,xlanchen2006.6.21,Embedded Operating Systems,17,消息队列的其他操作 int msgctl(int msqid, int cmd, struct msqid_ds *buf); 对由msqid标识的消息队列执行cmd操作: IPC_STAT:获取消息队列信息,返回的信息存贮在buf中; IPC_SET:设置消息队列的属性,要设置的属性存储在buf中;可设置属性包括:msg_
10、perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。 IPC_RMID:删除消息队列,xlanchen2006.6.21,Embedded Operating Systems,18,3、信号量,Semphore,用来对资源进行并发控制访问 通常是一个计数器 如果资源可用,值0 如果不可用,值=0 当进程需要访问资源,但资源不可用时,将计数值-1,并阻塞 当进程释放资源,使得资源有资源可用时,就唤醒被阻塞的进程,xlanchen2006.6.21,Embedded Operating Systems,19,获得信号量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 同步 通信
链接地址:https://www.31doc.com/p-3174721.html