进程的管道通信实验说明书.docx
- 文档编号:29547124
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:11
- 大小:41.19KB
进程的管道通信实验说明书.docx
《进程的管道通信实验说明书.docx》由会员分享,可在线阅读,更多相关《进程的管道通信实验说明书.docx(11页珍藏版)》请在冰豆网上搜索。
进程的管道通信实验说明书
*******************
实践教学
*******************
理工大学
计算机与通信学院
2011年秋季学期
操作系统原理课程设计
题目:
进程的管道通信实验
专业班级:
09计算机⑸班
姓名:
董跃永
学号:
09240521
指导教师:
年福忠
成绩:
摘要3
正文4
一.问题描述4
2.设计目的4
3.设计要求5
4.详细设计5
1.程序流程图6
2.算法设计7
5.结果分析9
设计总结10
参考文献11
致12
附件I源程序代码13
摘要
管道通信是发送进程和接收进程之间通过一个通道交流信息,管道是单向的,发送进程视管道为输出文件,即向管道写入数据,接收进程视管道为输入文件,即从中读取数据。
先写入的必定先读出,即管道通信的工作是单向的并以先进先出为顺序。
管道通信的实质是一个共享文件,数据以自然字符流的方式写入和读出。
在Linux系统中,进程在执行系统调用pipe()之后便创建了一个无名管道。
在管道通信实验中,可用父进程创建一个无名管道,子进程向其中写入信息,父进程从其中读取信息并显示。
关键词:
父进程,子进程,管道,通信,文件
正文
一.问题描述:
(1).了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。
(2).编写程序实现进程的管道通信。
用系统调用pipe()建立一管道,二
个子进程P1和P2分别向管道各写一句话:
Child1issendingamessage!
Child2issendingamessage!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后
P2)。
二.设计目的:
通过该题目的设计过程,熟悉UNIX/LINUX支持的管道通信方式,了解该系统下进程管道通信机制,掌握进程管道通信程常用的系统函数,能够编写代码实现父子进程的管道通信。
练习并掌握UNIX/LINUX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。
.设计要求:
编写程序实现进程的管道通信。
用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话
Child1issendingamessage!
Child2issendingamessage!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后
P2)。
四.详细设计:
1.程序流程图
函数的调用关系图:
开始
子进程2终止
父进程终止
2.算法设计
各模块的伪码算法
该函数使用头文件如下:
#include
#include
#include
#include
1.pipe()函数调用格式:
intfd[2];
pipe(fd)
功能:
建匿名管道,fd[0]为读端,fd[1]为写端。
2.fork()函数
调用格式:
pid_tpid1,pid2;
pid1=fork();
pid2=fork();
功能:
fork()函数创建子进程。
注:
此函数被调用一次但返回两次,子进程中返回0值,而父进程中返回子进程ID;调用fork()函数,父、子进程的执行次序不确定。
3.sprintf()函数
调用格式:
charoutpipe[50];
charstring=“hello”;
sprintf(outpipe,string);功能:
把字符串string的容写入到字符数组outpipe中。
4.write()函数
调用格式:
write(fd[1],outpipe,nbyte);
功能:
把nbyte个字节的数据,从outpipe所指向的缓冲区写到由fd所
指向的系统文件中。
写入容时,关闭读取端,锁定写入端,写入完成,解除锁定
5.read()函数调用格式:
read(fd[0],inpipe,nbyte);
功能:
从fd[O]端读取nbyte个字节的数据,并把数据写入到
6.lockf()函数调用格式:
lockf(fd[1],1,O);
功能:
锁定管道写端,保证写入数据的完整性。
lockf(fd[1],O,O);
功能:
解锁管道写端。
7.wait()函数
调用格式:
wait(NULL);
功能:
在用fork()创建一个子进程的时候,若先进入父进程,待,直到子进程把信息写入管道,再执行父进程。
8.sleep()函数
调用格式:
sleep(num);
功能:
使进程休眠num秒。
9.exit()函数
调用格式:
exit(O);
inpipe中。
则使其等
功能:
子进程执行写入数据操作完成,退出,并向系统返回
最终所得结果如下图所示:
设计总结
通过这次课程设计,我对操作系统的进程管道通信有了进一步的了解,同时熟悉了在linux环境下c语言的编译和调试,以及linux系统有关进程管道通信的函数。
更为重要的是,将所学的课本理论知识运用到实践当中,实现了理论与实践相结合,提高了解决实际问题的能力。
从开始借阅书籍,上网查找相关资料,到设计程序,短短两周很快就过去了。
在这次课程设计的过程中,我遇到了很多困难,通过自己的不断努力,同学的帮助,和老师的细心指导,进程的管道通信实验基本完成。
其功能基本符合课程设计任务的要求。
在此次实践设计中我遇到了很多困难,这说明对理论知识还需要深入地理解。
动手实践编写程序,调试程序则是更为重要的。
所以在平时学习课本知识的同时,需要亲自实践编写代码实现理论的知识,提高自己的实际动手能力,并加深对理论知识的理解。
最后,通过该题目的设计过程,我熟悉Linux操作系统、gcc、vim编辑器、makefile、gdb以及linux下进程的管道通信,进一步理解了操作系统中进程管道通信的原理,并学会如何在linux操作系统中实现进程的管道通信。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.电子科技大学学.
2.王清,光明.《计算机操作系统》.冶金工业.
3.钟秀等.《操作系统教程》.高等教育
4.曾明.《Linux操作系统应用教程》.科学技术.
5.丽芬,利雄.《操作系统实验教程》.清华大学.
6.孟静.《操作系统教程--原理和实例分析》.高等教育
7.周长林.《计算机操作系统教程》.高等教育
8.尧学.《计算机操作系统教程》.清华大学
9.任满杰.《操作系统原理实用教程》.电子工业
这次课程设计使我学到了很多实用知识,真正做到了理论与实践相结合,得到了操作系统方面的综合训练,提高了解决实际问题的能力。
这次课程设计也使我明白了,学习知识不仅仅是停留在书本上那么简单,编写代码,调试程序,更是一种有效地学习知识的方法。
只有理论与实践相结合才在以后的学习与工作中走的更高走的更远。
在此,感年福忠老师孜孜不倦的指导同学无私的帮助。
附录I:
源程序代码
#include
#include
#include
#include
intmain()
{
pid_tpid1,pid2;
intfd[2];
charoutpipe[50],inpipe[50];
if(pipe(fd)<0)/*创建匿名管道,fd[0]为读端,fd[1]为写端*/
{
printf("Pipecreateerror!
\n");
exit(-1);
}
/*****Thisisthechildprocess1*/
/*****fork函数被调用一次但返回两次,子进程中返回0值,而父进程中返回子进程ID;*/
但调用fork()父子进程的执行次序不确定.*/
/*如果创建子进程失败,则退出*/
if((pid1=fork())==-1)/*创建子进程1*/
{
printf("Errorinfork().\n");
exit(-1);
}
/*执行子进程1,向管道写入信息*/
if(pid1==0)
{
lockf(fd[1],1,0);/*锁定管道写端,保证写入数据的完整性*/sprintf(outpipe,"child1issendingamessage!
");
write(fd[1],outpipe,35);/*子进程向管道中写入信息*/lockf(fd[1],0,0);/*解锁管道写端*/
exit(0);/*子进程1退出*/
}
else
{
/*若先进入父进程,则使其等待,直到子进程1把信息写入管道*/
/*即:
先让子进程1把信息写入管道,后让子进程2把信息写入管道
*/
wait(NULL);
/*Thisisthechildprocess2*/
/*如果创建子进程失败,则退出*/
if((pid2=fork())==-1)
{
printf("Errorinfork().\n");
exit(-1);
}
/*执行子进程2*/
if(pid2==0)
{
lockf(fd[1],1,0);/*锁定管道写端,保证写入数据的完整性*/
sprintf(outpipe,"Child2issendingamessage!
");
write(fd[1],outpipe,34);
lockf(fd[1],0,0);/*解锁管道写端*/
exit(0);/*子进程2退出*/
}
else
{
wait(0);/*若先执行父进程,则等待,直到子进程2写入信
息*/
sleep
(1);
/*休眠1秒*/
/*从管道中读取信息,此信息由子进程1
/*打印输出信息*/
read(fd[0],inpipe,35);
写入*/
printf("%s\n",inpipe);
sleep
(1);
/*从管道中读取信息,此信息由子进程2
read(fd[0],inpipe,35);
写入*/
printf("%s\n",inpipe);
}
}
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 管道 通信 实验 说明书