- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程管理(更新)剖析
* 3.7.3 邮箱通信 信箱是一个用来对一定数量的消息进行缓存的地方。是一段存储区,每一个信箱用标识符加以区分,由信箱头和信箱体两部分组成。信箱头存放控制信息,信箱体存放消息内容。一个信箱可以被多个进程共享,就实现了消息的广播发送。 图3.18 邮箱通信结构 对于只有一发送进程和一接收进程使用的邮箱,则进程间通信应满足如下条件: ① 发送进程发送消息时,邮箱中至少要有一个空格能存放该消息。 ② 接收进程接收消息时,邮箱中至少要有一个消息存在。 * 设发送进程调用过程 deposit(m)将消息发送到邮箱,接收进程调用过程remove(m)将消息m 从邮箱中取出。另外,为了记录邮箱中空格个数和消息个数,信号量fromnum 为发送进程的私用信号量,信号量mesnum为接收进程的私用信号量。fromnum 的初值为信箱的空格数 n,mesnum 的初值为 0。则 deposit(m)和remove(m)可描述如下: deposit(m): begin local x P(fromnum) 选择空格x 将消息m放入空格x中 置格x的标志为满 V(mesnum) end * remove(m): begin local x P(mesnum) 选择满格x 把满格x中的消息取出放m中 置格x标志为空 V(fromnum) end 显然,调用过程deposit(m)的进程与调用过程remove(m)的进程之间存在着同步制约关系而不是互斥制约关系。 另外,在许多时侯,存在着多个发送进程和多个接收进程共享邮箱的情况。这时需要对过程deposit(m)和remove(m)作相应的改动。 * * 3.7.5 进程通信的实例——管道 管道(pipe):是一种共享文件模式,基于文件系统,连接于两个进程之间,以先进先出的方式实现消息的单向传送。 在UNIX系统中,管道的创建用函数pipe()实现。该函数返回用于读、写操作的文件描述符fd[0],fd[1]。读管道时调用read()函数,利用参数fd[0]从管道中读取字节。写管道时调用write()函数,利用参数fd[1]向管道写信息。 * 3.7.5 进程通信的实例——管道 管道(pipe):是一种共享文件模式,基于文件系统,连接于两个进程之间,以先进先出的方式实现消息的单向传送。 注意: 通过系统调用write()和read()进行管道的读写。 进程间要进行双向通信,通常需要定义两个管道。 只适用于父子进程之间的通信。管道能够把信息从一个进程的地址空间拷贝到另一个进程的地址空间。 2. 示例 例1: 用C语言编写一个程序,建立一个pipe,同时父进程生成一个子进程,子进程向pipe中写入一字符串,父进程从pipe中读出该字符串。 解: 程序如下: #include 〈stdio.h〉 main() { intx,fd[2]; char buf[30],s[30]; pipe(fd);/*创建管道*/ while((x=fork())==-1);/*创建子进程失败时,循环*/ if(x==0) * { sprintf(buf,″This is an example\n″); write(fd[1],buf,30);/*把buf中字符写入管道*/ exit(0); } else/*父进程返回*/ { wait(0); read(fd[0],s,30);/*父进程读管道中字符*/ printf(″%s″,s); } } * 例2: 编写一程序,建立一个管道。同时,父进程生成子进程P1,P2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们(如图3.22)。 图3.22 父进程和子进程P1,P2通信例子 解:程序框图如图3.23所示,源程序如下: * * #include 〈stdio.h〉 main() { inti,r,p1,p2,fd[2]; char buf[50],s[50]; pipe(fd);/*父进程建立管道*/ while((p1=fork())==-1);/*创建子进程P1,失败时循环*/ if(p1==0) /*由子进程P1返回,执行子进程P1*/ { lockf(fd[1],1,0);/*加锁锁定写入端*/ sprintf(buf,″child process P1 is sending messages!\n″); printf(″child pr
文档评论(0)