操作系统实验进程的通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档