linux多进程和进程间通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
物联网学院
20 15 / 2016 学年第 1 学期实验报告
课程名称:linux编程基础
实验名称:linux多进程和进程间通信
班级学号:
学生姓名:
指导教师
日期:20 15年12 月
实验六linux多进程与进程间通信
一、实验目的
熟悉linux系统编程方法
熟悉linux常用的系统调用
二、实验环境
PC机一台
安装虚拟机版的linux操作系统一台
三、实验预习
熟悉进程创建/线程创建系统调用
熟悉进程间通信系统的调用
四、实验内容
Linux fork调用
进程间通信系统调用:管道通信
五、实验步骤
编写一个程序,实现如下功能:
创建两个子进程,父进程向管道中按照顺序输入数字1 2 3 4 5 6……,另外两个子进程分别从管道中按照顺序读出奇数和偶数,及子进程1读出的数据应该是1 3 5 7 9……,而子进程读出的数据应该是2 4 6 8 10 ……数据,要求按先读奇数,再读偶数的顺序进行
程序代码如下:
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
int pid1,pid2;
main( )
{
int fd[2],i=0,j=0;
char outpipe[100],inpipe1[100],inpipe2[100],outpipe1[100];
pipe(fd); /*创建一个管道*/
while ((pid1=fork( ))==-1);
/*向管道中写入字符123456789*/
lockf(fd[1],1,0);
sprintf(outpipe,"123456789");
write(fd[1],outpipe,50);
lockf(fd[1],0,0);
/*----------------------------------*/
/*子进程1先读取管道中所有的字符,再重新把不需要的字符写入管道*/ if(pid1==0)
{
lockf(fd[0],1,0);
read(fd[0],inpipe1,10);
for(i=0;i<10;i++)//把不需要的字符写入管道
{
if(i%2)
{
outpipe1[j]=inpipe1[i];
j++;
}
}
lockf(fd[1],1,0);
write(fd[1],outpipe1,5);
lockf(fd[1],0,0);//写入结束
sleep(5); /*自我阻塞5秒*/ lockf(fd[0],0,0);
exit(0);
}
/*--------------------------------------------------*/ else
{
/*子进程2从管道中读取字符*/
while((pid2=fork( ))==-1);
if(pid2==0)
{
{
lockf(fd[0],1,0); /*互斥*/
read(fd[0],inpipe2,5);
lockf(fd[0],0,0);
}
sleep(5);
lockf(fd[0],0,0);
exit(0);
}
/*读取结束*/
else
{
wait(0); /*同步*/
read(fd[0],inpipe2,10); /*从管道中读长为50字节的串*/
printf("inpipe2 %s\n",inpipe2);
wait(0);
read(fd[0],inpipe1,10);
printf("inpipe1 %s\n",inpipe1);
exit(0);
}
}
}
实验结果如下:
六、实验思考
(1)、多进程与多线程相比,各自的优点和缺点是什么?
(2)、多线程的性能是否一定比多进程的性能好?如果不是,请举例说明。
不一定,在目标子动能交互少的情况下,用多进程更好。