青 岛 科 技 大 学 实 验 报 告
姓名 王茂林 专业 集成电路 班级 111 同组者
课程 操作系统 实验项目 实验 3.2 无名管道通信
实验目的:
1、了解管道通信机制的基本原理。
掌握父子进程使用无名管道通信的方法。
实验内容
父子进程基于无名管道的简单通信。
编写程序说实现多个进程基于无名管道进行通信。
实验步骤及结果:
1、启动windows下已经安装好的VMware虚拟机进入linux系统
2、等待系统初始化完毕后启动命令终端
3、阅读实验指导书
4、运行以下程序,观察程序运行结果:
/* pipe1.c */
#include
#include
#include
#include
#include
#include
#include
main()
{
int fd[2],pid,n;
char outpipe[50],inpipe[50];
pipe(fd);
pid=fork();
if(pid==0)
{
sprintf(outpipe,"I am child process");
lockf(fd[1],1,0);
write(fd[1],outpipe,strlen(outpipe));
lockf(fd[1],0,0);
printf("child process writes %d bytes: %s
",strlen(outpipe),outpipe);
}
else
{
wait(0);
lockf(fd[0],1,0);
n=read(fd[0],inpipe,25);
lockf(fd[0],0,0);
printf("parent process %d reads %d bytes: %s
",getpid(),n,inpipe);
}
}
编译运行结果如下:
在本实验中,首先创建管道,之后父进程使用 fork()函数创建子进程,最后通过关闭父进程的读描述符fd[0]和子进程的写描述符fd[1]来建立一个"父进程写入子进程读取"的管道,从而建立起它们之间的通信。
运行以下同一个进程树的兄弟进程通信程序,观察程序执行结果。
#include
#include
#include
#include
#include
#include
#include
main()
{
int fd[2],pid,pir,n,i;
char send[50]="b",receive[50]="b";
pipe(fd);
pid=fork();
if(pid==0)
{
while(send[0]!='a')
{
printf("Child1 inputs information from keyboard:
");
scanf("%s",send);
lockf(fd[1],1,0);
write(fd[1],send,strlen(send));
lockf(fd[1],0,0);
sleep(1);
}
}
else
{
pir=fork();
if(pir==0)
{
while(receive[0]!='a')
{
lockf(fd[0],1,0);
n=read(fd[0],receive,20);
lockf(fd[0],0,0);
printf("Child2 received:%s
",receive);
}
}
else
{
wait(0);
wait(0);
printf("parent is kill!
");
}
}
}
编译运行结果如下所示:
在上述程序中,父进程先创建管道,再创建两个子进程。第一个子进程把从键盘接收到的信号写入无名管道,当从键盘接收到首字母为‘a’的信息时结束。第二个子进程从无名管道中读取数据,当从无名管道中读出的首字母为‘a’时结束。父进程利用wait(0),等待两个子进程运行结束后,输出“parent is kill”退出程序。
编写程序实现多个进程基于无名管道进行通信。用系统调用pipe()建立一个无名管道,实现两个子进程p1和p2分别向管道写入一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程从无名管道中读出两个来自子进程的信息并显示。
#include