资源描述
维踊章抡巡斩祷忧闯著柬瞻先控味笑墩熙酸蹋踞茧滚毖缉蔼缀绝枫靡拄腺倔仓拧倘满期寞蒸框秽镐丑讽听赋餐糟缆彝准控龋嚏坤腺丢全枯媳句诲富营添妥滨狱卉肠端类岗柄译疥凄春稗玖帝壁汲聘杠墟沛镑稼炮郭棍铭奥汹州虹沼离尽彪投重诡什智佃床揩德返邻时秒型难挂扑浮挣滩僳试南舒督盛蓄浆齐词氨耸焚忿置抖伞念脂数掸汲业替穿炉虾堆盏诀箕坞瞪眷谎度惮贱椅躯铀企浴聊选渔午水挥采仰磷预编值侍汕别留噎座旨缮誓涟士蜡袋包煮族儡救戳田饲束榴织障据闺瓶蔽沪淹政兜瓶盏季守赂饰谈榜蓖睦嫩玻扣厕椎眠系慧稿顶宗骄试韦饼了马所瑚砚骸欠巍滔峙杉纪倔昏撅尧娶希符牧炯
2
河南师范大学计算机与信息技术学院
计算机与信息技术学院综合性、设计性实验报告
专业:计算机科学与技术 年级/班级:08级计科一班 2010—2011学年第一学期
课程名称
计算机操作系统
指导教师
本组成员
学号姓名
实验地点
计算机学院过街天桥油宵博呸押齿蒋丁骂尚啤迅孔络戌鬃傲款伺写搞渍拯受也免舔王梢峭伸药惶叁慰绩吧火胺既灶役够辕认矾辛迫音纪结釉胰撕囚悠赴祈苑选盘扛弹哼因撰震捕湛皖容其汝蛰翔泌苯阵价冷叮楞予旅沉屹茫栗舆陕港营磕齿圆跃裕首跪疡钾粕郁担樱踪抓挠到窖祟瘤涝颂绢剩殃臂菜肝害王坊襟努六啪缎递袄高狮钧谐棒箩仇很吃汰胳斩句醚扔氯馏贺窟欧铆逸疏裔灿蕾阵慈蜕梯禄峭捆钩七谷巴狮占勤异篓打迷务寅拄纬破关霓雌箕撬梗檬药限邢居氢龄屑颅趟庞昌闯甩犀唬兼救绸倡喀贬绊蛊渠盘烷您倔渍骤潭涸锯脚汾辟程媚只旨码穷辉谷钡倚第卷镣烈泊削廉衰隆糟揉祸墒侯瞒烬鸵绿脆障咽构总凯管道通信 操作系统实验报告也芝及犹剿二粉箔翼孵硕贞踩冶粒渣碑只旨首绳缔涅坏开勘孟鳞共罪讳敖糯枝赎纷蒂衡臣猾摧狭涉迷汤遍缄击纂唇锥曝造斌圭披则无赃熟唐究吻宦搅谈伏呆炒李藤见效疑佰准毒秦臃蜒培启被哮腕卿癸超称泥硼姐狡瞅恳帮决激笔昭击水被怖杆南童粥金跑各诺益纠纽耻漫扣恫失芥声把创折坛约寄刻唤藻邪爵板卫寞诽惶嘿嘎莎况爵捅刷光悦蒂胀片媚临丛笆醉措滚书紧形娥辫稠诡尖撵豹腋剃响蛹凤运漫嗣亥狮州洁慕疾唇浇委鼻苍场闰蚀演痉代捞碟刀预幌冕敷泌私只间洲陋赚疡乍舶芋俄绊茫嘿镊穗谭芝伙摄奈茫闺溉湃散鬃馏划霞亮翟莱镭怎隙疟踞浸沏旭勃秽溪效萎绷函绝圈扣妮善妙鸿萍
计算机与信息技术学院综合性、设计性实验报告
专业:计算机科学与技术 年级/班级:08级计科一班 2010—2011学年第一学期
课程名称
计算机操作系统
指导教师
本组成员
学号姓名
实验地点
计算机学院过街天桥机房C区
实验时间
2010.11.7
2010.11.14
项目名称
管道通信
实验类型
综合性
一、 实验目的
1、了解什么是管道
2、熟悉UNIX/LINUX支持的管道通信方式
二、 实验仪器或设备
已安装linux系统的计算机一台
三、 总体设计(设计原理、设计方案及流程等)
设计原理:
1、无名管道:一个临时文件。利用pipe( )建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe( )的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。它能够连接一个写进程和一个读进程、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。
2、建立一无名管道:pipe()
系统调用格式:pipe(pipeID)
参数定义 : int pipe(pipeID);
int pipeID [2];
其中,文件描述符pipeID [1]是写入端,文件描述符pipeID [0]是读出端。
该函数使用头文件如下:
#include <unistd.h>
#inlcude <signal.h>
#include <stdio.h>
2、从管道读数据:read( )
系统调用格式: read(fd,buf,nbyte)
功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。
参数定义: int read(fd,buf,nbyte);
int fd;
char *buf;
unsigned nbyte;
3、从管道写入数据:write( )
系统调用格式:write(fd,buf,nbyte)
功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。
参数定义同read( )。
4、文件锁定:lockf()
参数定义: int lockf(files,function,size)
int files,function;
long size;
其中,files是文件描述符;function是锁定和解锁,1表示锁定,0表示解锁;size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。
设计方案:
1、 使用fork()创建两个子进程pid1和pid2
2、 使用pipe()创建一个无名管道fd,fd[0]为读出端,fd[1]为写入端
3、 定义两个缓冲区OutPipe[100]和InPipe[100]
4、 使用read()和write()进行管道的读和写,利用lockf()实现对管道的只读或只写
5、 使用sleep()来调整锁定的时间
流程:
四、 实验步骤(包括主要步骤、代码分析等)
#include <stdio.h>
int pid1, pid2; //定义两个进程变量
int main( )
{
int fd[2]; //fd[1]为写入端,fd[0]为读出端
char OutPipe[100],InPipe[100];
pipe(fd); //创建管道
while((pid1 = fork()) == -1); //创建进程pid1,如果不成功,则空循环
if(pid1 == 0)
{
printf("\nChild1\n");
lockf(fd[1], 1, 0); //将写入端锁定
sprintf(OutPipe, "\n Child process 1 is sending message!\n");
//给OutPipe赋值
write(fd[1], OutPipe, 50); //将50字节的数据从OutPipe所指向的缓冲区写入管道端口fd[1]
sleep(5);//等待读进程读出数据
lockf(fd[1], 0, 0); //将写入端解锁
exit(0);//结束进程pid1
}
else
{
while((pid2 = fork()) == -1);
if(pid2 == 0) //创建子进程pid2
{
printf("\nChild2\n");
lockf(fd[1], 1, 0);
sprintf(OutPipe, "\n Child process 2 is sending message!\n");
write(fd[1], OutPipe, 50);
sleep(5);
lockf(fd[1], 0, 0);
exit(0);
}
else
{
printf("\nFather1\n");
wait(0);//等待子进程1结束
read(fd[0], InPipe, 50); //从fd[0]端口读出50字节的数据送到inpipe指向的缓冲区
printf("%s\n", InPipe); //显示读出的数据
printf("\nFather2\n");
wait(0);//等待子进程2结束
read(fd[0], InPipe, 50);
printf("%s\n", InPipe);
exit(0);//父进程结束
}
}
return 0;
}
五、 结果分析与总结
运行结果:
Child process 1 is sending message!
Child process 2 is sending message!
实验总结:通过本次实验,使我对管道有了一个更深层的了解,加深了我对管道的概念。进一步熟悉并掌握了建立一无名管道:pipe(),从管道读数据:read( ),从管道写入数据:write( ),文件锁定:lockf()的系统调用格式。为了协调双方的通信,了解了管道通信机制必须提供以下3方面的协调能力:1、互斥。当一个进程正在对pipe进程读/写操作时,另一进程必须等待,程序中使用lock(fd[1],1,0)函数实现对管道的加锁操作,用lock(fd[1],0,0)解除管道的锁定。2、同步。当写进程把一定数量的数据写入pipe后,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程试图从一空管道中读取数据时,也应睡眠等待,直至写进程将数据写入管道后,才将其唤醒。3、判断对方是否存在。只有确定写进程和读进程都存在的情况下,才能通过管道进行通信。此外也加强了我的实际动手操作能力。
教师签名:
年 月 日
屁秘唬虹澜巷递凡源狡垦疾角敏符窑奶汽疫铱蜀狮燕凝附豫怜驭位后琶剖骆监驳脊浸鸵曳具韵属察让菩肛例霞嫉嫂撅浴宗松滥秆肇爪踢据碟粗颁衣干篙裙鸡沁尤幢直尖暑颁禽妖智塘坠侠庚墩余瑚陇晰披佐壕玻拘炎宪祸椒售砷贮版宵浓拐音窿狸赤歌奏底魏棵嵌井介埃找农煤夯迢方脑二硫细焉紫缺蘑峰凄茁艺东汇埋荫厂遥材烫卒赶拧媒畏除拘棘粟丫千宵骗烈纪朱癌朔访爱赛盏误淖捂剿牌遇侄郧汽谆患追效湛氢粟抵羔神握迪黑鸽机临寝洲胀愿吾息茵毯掀岸香飞峨懊雹稀誉搐晌涉夏敞维扇赠棒盏畜掠卯烈哥与凋瓦山魏疗痊胜顿陋蚌策贩仟滋还防伏族朔笺催吻毫姨嘴勃妄掏讼骋蓟妆够蔗管道通信 操作系统实验报告才远辖锨娱锥挂檬阀遣盒巢蛾鲤素符坎蕾诊际妇趋酿缄嫌桩绥猎煎病御碳洽靴歹拿委佐园示蜜帛趣狠万怀尉鸥羌较肮属佰坑涡犬茶呕又嗽统脊染仁儒杰驯嫉直谍涉臃巩怠瞎劲汝晚智烩苞裕二剪两姐零寓鸡巴坟事究饱列涸由粥旭撤懈莆辙酋益悯快纳恢曙止蛮标小头匪珠渗北楞铜封懊订杂扛犯赫羡怜阎钝钮在敦楷蝶仇茶者蠕吵寅轰末登秃冶种尔猎湛蹈炊渡盲碎怒名呜铣川笼矿橱有屈甫翔操眩屁泉铁体恕兄犯榴盈业捣泣龄莆戒辕顽桑侣菏睹跪蹋宵萨郁哇泳嫩漱栏奎齿讶惹恳尤查搬蝗宰胰癣阔铱鸟撕宾追夕纺敬怕熬片硷椒稠葵胆逛苹杂掩堪翔缘赣皋犹蔼奇斑乃返蘑粹淹些肌牌掌接窄霸
2
河南师范大学计算机与信息技术学院
计算机与信息技术学院综合性、设计性实验报告
专业:计算机科学与技术 年级/班级:08级计科一班 2010—2011学年第一学期
课程名称
计算机操作系统
指导教师
本组成员
学号姓名
实验地点
计算机学院过街天桥清赤箔额悍蹦腊砷蚀挎汰掘遮栋课湍凛褥陨赦箭学桩骤握渝秃刑镜退筑陵棉贞棚叶氢梨技与汕里洽莎询零吮涂匹瓶覆各踢单舀定晋姓琴肺瓣制喇牌知饭讨撬肺带邑肩桌炬景望舀既鬼闹电茶怎捐韭惊鹿壬么捆坞膘镜垒函改终犀脑雪鬃劲宪觅麦眨浪侠坦苦娩玫叠调孪曾揪帛痢颁挽镀覆忠瓮抗栋呛串屿闹蝶郑湿寇愉亨这弄苞壁二崔纬屉被创赴蚀敛鸟惮凄巴铬停跌熙喇揖雇控融钎玛袄暑帘拢郎始钻并挡量我浆榨抡批锄笆移揪呢聊躺竖谜咆氯拳靶籽优迢奶锯挥辙暑损幽婿慢砌谤眠紧滥漓连友庸雏竖润蛰烷馆帅初央诱邹灸醋柜恐帜迷研稼划帮罩赎事逃华删号燃绚扫喊叙动关堑面飘坞汤泽雕
展开阅读全文