GDOU-B-11-112
广东海洋大学学生实验报告书(学生用表)
实验名称进程间通信
学院(系)
学生姓名
课程名称专业操作系统课程号班级实验日期软件学院学号软件工程实验地点
一、实验目的
1、利用文件锁机制,实现多进程共享一个文件,具体过程和要求参照课堂讲解。
2、利用双向管道机制实现进程间通信,父子两个进程,第一个进程从键盘输入多个整数(以-1表示整数序列的结束,-1不属于其中),每输入一个整数,便立即通过管道传送给第二个进程;第二个进程对收到的数据进行排序(排序算法同学们自选,冒泡、选择、堆…均可),排序结果通过管道传递给第一个进程;第一个进程显示排序结果。
选做题:利用LINU_进程间共享内存机制实现第2题,亦即将管道用共享内存机制来代替。
二、实验内容
1、(1)新建文件,编辑程序如下:
define_POSI__SOURCE
include
include
include
include
include
include
include
include
intmain(intargc,charargv[])
intnum,fd,i;
FILEf;
charbuff[100];
fd=open("XXX",O_RDWR);
flock(fd,LOCK_E_);
if(fd<=0){
printf("openerror ");
return1;
f=(FILE)fdopen(fd,"r+");
if(f==NULL){
printf("fdopenerror ");
return1;
for(i=1;i<=100000;i++){
lseek(fd,0,SEEK_SET);
fscanf(f,"%d",num);
sprintf(buff,"%d ",num+1);lseek(fd,0,SEEK_SET);write(fd,buff,strlen(buff));}
flock(fd,LOCK_UN);
fclose(f);
return0;
(2)执行结果如下:
2、(1)新建文件,编写程序如下:include
include
include
intmain()
intfd1[2];
intfd2[2];
pid_tpid;
pipe(fd1);
pipe(fd2);
pid=fork();
if(pid==0)
close(fd1[1]);
close(fd2[0]);intnum;
intsum=0;
charstr[10];
while(read(fd1[0],str,100)>0)
sscanf(str,"%d",num);
printf("receiveanumber:%d ",num);fflush(stdout);
sum+=num;
close(fd1[0]);
sprintf(str,"%d",sum);
write(fd2[1],str,strlen(str));
close(fd2[1]);
_e_it(0);
else
intn;
charstr[10];
close(fd1[0]);
close(fd2[1]);
while(1)
scanf("%d",n);
if(n==-1)break;
sprintf(str,"%d ",n);
write(fd1[1],str,strlen(str));}
close(fd1[1]);
read(fd2[0],str,100);
close(fd2[0]);
printf(" sumis%s ",str);
fflush(stdout);
_e_it(0);
return0;
(2)执行结果如下:
三、实验总结
通过这次实验,使我了解了文件锁机制是如何控制多进程共享同一文件的,以及系统是如何利用双向管道机制实现进程间通信。
成绩指导教师日期
注:请用A4纸书写,不够另附纸。
下载本文