进程间通信实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)
实验名称进程间通信课程名称操作系统课程号
学院(系) 软件学院专业软件工程班级
学生姓名学号实验地点实验日期
一、实验目的
1、利用文件锁机制,实现多进程共享一个文件,具体过程和要求参照课堂讲解。
2、利用双向管道机制实现进程间通信,父子两个进程,第一个进程从键盘输入多个整数(以-1表示
整数序列的结束,-1不属于其中),每输入一个整数,便立即通过管道传送给第二个进程;第二个进
程对收到的数据进行排序(排序算法同学们自选,冒泡、选择、堆…均可),排序结果通过管道传递
给第一个进程;第一个进程显示排序结果。
选做题:利用LINUX进程间共享内存机制实现第2题,亦即将管道用共享内存机制来代替。
二、实验内容
1、(1)新建文件,编辑程序如下:
#define _POSIX_SOURCE
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char * argv[])
{
int num, fd,i;
FILE *f;
char buff[100];
fd = open("number.txt", O_RDWR);
flock(fd,LOCK_EX);
if(fd<=0){
printf("open error\n");
return 1;
}
f = (FILE *)fdopen(fd, "r+");
if(f == NULL){
printf("fdopen error\n");
return 1;
}
for(i=1;i<=100000;i++){
lseek(fd, 0, SEEK_SET);
fscanf(f, "%d", &num);
sprintf(buff, "%d\n", num + 1);
lseek(fd, 0, SEEK_SET);
write(fd, buff,strlen(buff));
}
flock(fd,LOCK_UN);
fclose(f);
return 0;
}
(2)执行结果如下:
2、(1)新建文件,编写程序如下:#include
#include
#include
#include
int main ()
{
int fd1[2];
int fd2[2];
pid_t pid;
pipe(fd1);
pipe(fd2);
pid = fork();
if (pid == 0)
{
close(fd1[1]);
close(fd2[0]);
int num;
int sum = 0;
char str[10];
while(read(fd1[0], str, 100)>0)
{
sscanf(str, "%d", &num);
printf("receive a number : %d\n", num); fflush(stdout);
sum += num;
}
close(fd1[0]);
sprintf(str, "%d", sum);
write(fd2[1], str, strlen(str));
close(fd2[1]);
_exit(0);
}
else
{
int n;
char str[10];
close(fd1[0]);
close(fd2[1]);
while(1)
{
scanf("%d", &n);
if(n == -1)break;
sprintf(str, "%d\n", n);
write (fd1[1], str, strlen (str));
}
close(fd1[1]);
read(fd2[0], str, 100);
close(fd2[0]);
printf("\nsum is %s\n", str);
fflush(stdout);
_exit(0);
}
return 0;
}
(2)执行结果如下:
三、实验总结
通过这次实验,使我了解了文件锁机制是如何控制多进程共享同一文件的,以及系统是如何利用双向管道机制实现进程间通信。
成绩指导教师日期注:请用A4纸书写,不够另附纸。