实验二 Linux进程间通信
实验二 Linux进程间通信
1.实验目的
(1) 分析进程争用临界资源的现象,学习解决进程互斥的方法;
(2) 学习如何利用进程的“软中断”、管道机制进行进程间的通信,并加深对
上述通信机制的理解;
(3) 了解系统调用pipe( )、msgget( )、msgsnd( )、msgrcv( )、msgctl( )、shmget( )、
shmat( )、shmdt( )、shmctl( )的功能和实现过程,利用共享存储区机制进行进程间通信。
2.实验内容
(1) 进程的控制
编写一段程序,使用系统调用fork()创建两个子进程。各进程循环显示不同的信息(如20次):父进程显示:“parent:”加上进程ID,子进程分别显示:“Child1:”(或“Child2:”)加上自己的进程ID。观察程序执行时屏幕上出现的现象,并分析原因,进一步理解各个进程争夺临界资源(显示器)的情况。 接着在程序中使用系统调用locking( )来给每一个进程加锁,实现进程之间的互斥,试观察并分析出现的现象。
(2) 进程的软中断通讯
编制一段程序,实现进程的软中断通讯:使用系统调用fork( )创建两个子进程;再使用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);在捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发信号;子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程都终止以后,输出如下信息后终止: Parent process in killed!
(3) 进程的管道通讯
编制一段程序,实现进程的管道通讯:使用系统调用pipe( )建立一条管道线;两个子进程分别循环向这条管道写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则循环从管道中读出信息,显示在屏幕上。
3.实验提示
(1) 用4个基本系统调用实现进程的创建,执行和自我终止:
① fork() 创建一个子进程。用它创建的子进程是fork调用者进程(即父进程)的复制品,即进程映象。除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。
如果创建进程失败,则fork()返回值为-1;若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是0。m=fork()。
② wait()
③ exit()
④ getpid()
编程示例:
例1:编写一个程序,父进程生成一个子进程,父进程等待子进程wait(),子进程执行完成后自我终止exit(),并唤醒父进程。父、子进程执行时打印有关信息。
main()
{ int i,j,k;
if (i=fork()) // 非零值
{ j=wait();
printf("Parent process!\n");
printf(“i=%d j=%d\n”, i, j);
}
else{ k=getpid();
printf("Child process!\n");
printf(“i=%d k=%d\n”, i, k);
}
}
父进程处于阻塞(或等待)状态,等待子进程执行完成终止后子进程自我终止,释放所占资源,通知父进程可以删除自己。获得进程的标识数(进程号),一般是正整数。P=getpid()。 继续工作。其返回值为等待子进程的子进程号。n=wait()。 此时它的状态变成P_state=SZOMB。
(2) 进程的“软中断”通信
它可用于同一用户的进程之间通信。其方式是:一个进程通过系统调用kill(pid,sig) 向同一用户的其它进程pid发送一个软中断信号;另一进程通过系统调用signal(sig,func)捕捉到信号sig后,执行预先约定的动作func,从而实现这两个进程间的通信。
① 发送信号kill(pid,sig),本进程将指定信号sig发送给指定进程pid,其
中参数为pid进程号,pid与sig均为整数值.
② 接收信号signal(sig,func),本进程接收到其它进程发送给它的信号后,完成指定的功能func. func一般是函数.
例2. 编写一个程序,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程.
int func();
main()
{ int i,j:
signal(17,func);
if(i=fork())
{ printf("Parent: Signal 17 will be send to Child! \n");
kill(i,17);
wait(0);
printf("Parent: finished! \n");
}
else{ sleep(10);
printf("Child: A signal from my Parent is received! \n") ;
exit();
}
}
func()
{printf("It is signal 17 processing function! \n");
执行结果如下:
Parent: Signal 17 will be send to Child!
It is signal 17 processing function!
Child: A signal from my Parent is received!
Parent: finished!
在程序中系统调用sleep(second)用于进程的同步与互斥,自变量是暂停秒数.其功能是使现行进程暂停执行由自变量规定的秒数.
类似的系统调用有pause(),它的功能是暂停执行本进程,等待kill发来的信号,收到信号后再继续执行.
在特殊情况下,常用到如下语句signal(SIGINT,SIG_IGN).它表示遇到了中断信号SIGINT(按Del键).本进程不做任何动作,即勿略该中断信号对本进程的影响.
(3) 进程的控制
利用系统调用lockf(fd,mode,size),对指定文件的指定区域(由size指示)进行加锁或解锁,以实现进程的同步与互斥.其中fd是文件描述字;mode是锁定方式,=1表示加锁,=0表示解锁,size是指定文件fd的指定区域,用0表示从当前位置到文件尾.
常用程序段
fd = open( "a.out",2 );
if( i==0 )
{ lockf(fd,1,0);
………
lockf(fd,0,0);
}
例3. 编写一个程序,创建一个文件,文件名为lock.dat,同时父进程创建2个子进程,通过系统调用lockf(),分别让2个子进程对文件加锁,再输出有关信息,然后解锁.
char buf[]={"check lock!\n"};
main()
{ int i,p1,p2,fd;
fd=creat("lock.dat",0644);
write(fd,buf,20);
while((p1=fork())==-1);
if(p1==0)
{lockf(fd,1,0);
for (i=1;i<=3;i++)
printf("child1!\n");
lockf(fd,0,0);
}
else{while((p2=fork())==-1);
if (p2==0)
{lockf(fd,1,0);
for (i=1;i<=4;i++)
printf("child2!\n");
lockf(fd,0,0);
}
else printf("parrent!\n");
}
close(fd);
}
(4) 进程管道的通信
建立进程间的管道,格式为:
pipe(fd);
int fd[2];
其中,fd[1] 是写端,向管道中写入;
fd[0] 是读端,从管道中读出;
本质上将其当作文件处理.进程间可通过管道,用write与read来传递数据,但write与read不可以同时进行,在管道中只能有4096字节的数据被缓冲.
例4. 编写一个程序,建立一个pipe,同时父进程产生一个子进程,子进程向pipe中写入一个字符串,父进程从中读出该字符串,并每隔3秒种输出打印一次.
{ int x,fd[2];
char S[30];
pipe(fd);
for (;;)
{ x=fork();
if (x==0)
{sprintf(S,"Good-n …… 此处隐藏:1948字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教学研究]2012西拉科学校团少队工作总结
- [教学研究]建筑工程公司档案管理制度
- [教学研究]小学数学人教版六年级上册圆的周长和面
- [教学研究]ERP电子行业解决方案
- [教学研究]钢支撑租赁合同范本
- [教学研究]预应力自动张拉系统用户手册Rev1.0
- [教学研究]MOOC课程:金瓶梅人物写真(每章节课后
- [教学研究]追加被执行人申请书(适用追加夫妻关系)
- [教学研究]2014年驾考科目一考试最新题库766
- [教学研究]2013-2014学年度九年级物理第15章《电
- [教学研究]新版中日交流标准日本语初级下26课-客
- [教学研究]小导管注浆施工作业指导书
- [教学研究]一般财务人员能力及人岗匹配评估表
- [教学研究]打1.2.页 小学一年级暑假口算100以内加
- [教学研究]学习贯彻《中国共产党党和国家机关基层
- [教学研究]2012年呼和浩特市中考试卷_35412
- [教学研究]最简易的电线电缆购销合同范本
- [教学研究]如何开展安全标准化建设
- [教学研究]工作分析与人岗匹配
- [教学研究]2016-2017学年高中历史第七单元现代中
- 山东省义务教育必修地方课程小学三年级
- 台湾宜兰大学互联网交换技术课程 01_In
- 思想品德:第一课《我知我家》课件(人
- SAR合成孔径雷达图像点目标仿真报告(附
- 利辛县“十三五”规划研究报告
- 2015-2020年中国手机APP行业市场发展趋
- 广告策略、创意表现、媒体方案
- 企业如何申请专利的的几点思考
- 《中国教育简史》网上作业
- 高中历史第二单元西方人文精神的起源及
- 年终晚会必备_精彩的主持稿_精心整理_
- 信息工程专业自荐书
- 2019高考历史人教版一轮练习:第十二单
- JAVA俱乐部管理系统软件需求规格说明书
- 2016-2021年中国小型板料折弯机行业市
- (人教新课标)六上_比的基本性质课件PPT
- 辽宁省公务员考试网申论备考技巧:名言
- 神经阻滞麻醉知情同意书
- 施工企业信息填报、审核和发布的相关事
- 初一(七年级)英语完形填空100篇




