操作系统实验进程的通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(操作系统原理和linux操作系统相结合的实验)
实验二进程的通信
一实验目的
1 学会使用vi编辑器编辑C语言程序
2 学会Linux环境下gcc的使用
3 学会调试工具GDB的使用
二实验原理
1 利用linux提供的进程通信的系统调用设计进程通信程序,加深对进程通信概念的理解。
2 体会进程通信的方法和效果。
三实验环境
PC机1台,Windows操作系统和其上的虚拟Linux操作系统。
四实验步骤
1.管道通信
(1)编写一个程序。父进程创建一个子进程和一个无名管道fd,由子进程向管道写入信息“This is a message”,然后终止执行;父进程接收到子进程终止信号后从管道中读出并显示信息后结束。
#include
#include
main()
{
int p1,fd[2];
char outpipe[50]; //定义读缓冲区
char inpipe[50]="This is a message!"; //定义写缓冲区
pipe(fd); //创建无名管道fd
while((p1=fork())==-1);
if (p1==0) //子进程返回
{
write(fd[1],inpipe,50); //写信息到管道
exit(0);
}
else //父进程返回
{
wait(0); //等待子进程终止
read(fd[0],outpipe,50); //从管道读信息到读缓冲区
printf("%s\n",outpipe); //显示读到的信息
exit(0);
}
}
(2)父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。(源程序pipe_1.c)
#include
main()
{
int I,r,j,k,l,p1,p2,fd[2];
char buf[50],s[50];
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
{
lockf(fd[1],1,0);
sprintf(buf,"Child process p1 is sending message!\n");
printf("Child process p1!\n");
write(fd[1],buf,50);
lockf(fd[1],0,0);
sleep(5);
j=getpid();
k=getppid();
printf("p1 %d is weakup.My parent process id is %d.\n",j,k);
exit(0);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
lockf(fd[1],1,0);
sprintf(buf,"Child process p2 is sending message!\n");
printf("Child process p2!\n");
write(fd[1],buf,50);
lockf(fd[1],0,0);
sleep(5);
j=getpid();
k=getppid();
printf("p2 %d is weakup.My parent process id is %d.\n",j,k);
exit(0);
}
else
{
I=getpid();
wait(0);
if(r=read(fd[0],s,50)==-1)
printf("can’t read pip e.");
else
printf("Parent %d:%s\n",l,s);
wait(0);
if(r=read(fd[0],s,50)==-1)
pr intf("can’t read pipe");
else
printf ( "Parent %d:%s\n",l,s);
exit(0);
}
}
}
结果:
2.共享内存通信。
编程实现消息的发送与接收:发送进程将要发送的消息从键盘输入,每输入一行就作为一条消息发送,用“end”作为结束消息。(源代码:sndshm.c)
接收进程从消息队列上逐个取出消息并显示输出,也用“end” 作为结束消息。通过先运行发送进程然后再运行接收进程的方式来实现同步。(源代码:rcvshm.c)
发送进程源代码:sndshm.c如下:
#include
#include
#include
#include
#include
#include
main()
{
int shmid; /*定义共享内存内部标识shmid */
char *viraddr; /*定义附接共享内存的虚拟地址*/
char buffer[BUFSIZ]; /*定义存放信息的字符型数组*/
shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT); /*创建共享内存*/
viraddr=(char*)shmat(shmid, 0,0); /*附接到进程的虚拟地址空间*/
while(1) /*循环输入信息*/
{
puts("Enter some text:");
fgets(buffer,BUFSIZ,stdin);
strcat(viraddr,buffer); /*采用追加方式写到共享内存*/
if(strncmp(buffer,"end",3)==0) /*输入为“end”时结束*/
break;
}
shmdt(viraddr); /*断开附接*/
exit(0);
}
接收进程源代码:rcvshm.c如下:
#include
#include
#include
#include
#include
#include
main()
{
int shmid;