当前位置:文档之家› Linux进程间通信程序设计

Linux进程间通信程序设计

计算机与信息技术学院设计性实验报告
一、实验目的
(1)理解进程概念;
(2)理解并掌握多进程开发模式;
(3)理解并掌握Linux平台进程间数据的传送方法。

二、总体设计
(1)实验内容:编写程序实现进程的管道通信。

用系统调用pipe( )建立一管道,创建两个二个子进程P1和P2分别向管道各写一句话:
Message from child P1!
Message from child P2!
父进程从管道中读出二个来自子进程的信息并显示。

(2)设计原理:
所谓管道,是指能够连接一个写进程和一个读进程、并允许它们进行通信的一个共享文件,又称为pipe文件。

由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。

通过管道的信息流
三、实验步骤:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
# include <string.h>
#define BUFSIZE 100
int pid1,pid2;
int main()
{
int fd[2];
char buf_out [BUFSIZE], buf_in [BUFSIZE];
if (pipe(fd) < 0)
{ printf("pipe error\n"); exit(1); } /*创建一个管道*/
if ((pid1 = fork()) < 0) /*创建子进程1*/
{ printf("fork1 failure\n"); exit(1); }
else if (pid1 == 0)
{
lockf(fd[1],1,0);
strcpy(buf_out," Message from child P1!"); /*把串放入数组buf_out中*/
write(fd[1],buf_out,BUFSIZE); /*向管道写长为BUFSIZE字节的串*/ sleep(5); /*自我阻塞5秒*/
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork( ))==-1); /*创建子进程2*/
if(pid2==0)
{ lockf(fd[1],1,0); /*互斥*/
sprintf(buf_out,"Message from child %d!",getpid());
write(fd[1], buf_out,BUFSIZE);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{ wait(0); /*同步*/
read(fd[0], buf_in,BUFSIZE); /*从管道中读长为BUFSIZE字节的串*/
printf("%s\n", buf_in);
wait(0);
read(fd[0], buf_in,BUFSIZE);
printf("%s\n", buf_in);
exit(0);
}
}
return 0;
}
四、结果分析与总结
延迟5秒后显示
Message from child P1!
再等待5秒显示
Message from child P2!
总结:本实验通过父进程用pipe( )建立一个无名管道,再用fork函数创建了两个子进程,父进程从管道中读出二个来自子进程的信息并显示,利用锁定与解锁实现了两个子进程向管道互斥通信。

通过本次实验了解到进程的概念,知道了什么是管道,并且熟悉了LINUX支持的管道通信方式,开始时对子进程P1和P2为什么能够对管道进行操作产生疑问,后来明白子进程P1和P2之所以能够对管道进行操作是其调用pipe()进程并识别该管道描述符,此次实验使我获益匪浅。

教师签名:
年月日。

相关主题