基于管道的进程通信 操作系统实验报告2
实验3 进程的管道通信实验

父进程和子进程间管道通信示例
• 例1:用C语言编写一个程序,建立一个 pipe,同时父进程生成一个子进程,子进向 pipe中写入一字符串,父进程从pipe中读出 该字符串。
程序
# include <stdio.h> main() { int x, fd[2]; char buf[30],s[30]; pipe(fd); /*创建管道*/ while((x=fork()) = = -1); /*创建子进程失败时,循环*/ if(x = = 0) { sprintf(buf, ”This is an example\n”); write(fd[1],buf,30); /*把buf中字符写入管道*/ exit(0); } else { wait(0); read(fd[0],s,30); /*父进程读管道中字符*/ printf(“%s”,s); } }
管道的实现原理(1)
• 利用linux提供的系统调用pipe,可建立一 条同步通信管道。其格式为: pipe(fd) int fd[2]; • fd[ห้องสมุดไป่ตู้]为写入端,fd[0]为读出端。
管道的实现原理(2)
• 通过文件系统的系统调用write和read进行管 道的写和读;
– 管道按FIFO(先进先出)方式传送消息 – 只能单向传送消息,进程间双向通信,通常需要 两个管道; – 只适用于父子进程之间或父进程安排的各个子进 程之间。
实验3 进程的管道通信实验
实验目的
• 1、了解什么是管道 • 2、熟悉UNIX/LINUX支持的管道通信 方式
实验内容
• 编写程序实现进程的管道通信。用系统调 用pipe( )建立一管道,二个子进程P1和P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信 息并显示(要求先接收P1,后P2)。
操作系统原理-进程管理与进程通信

广州大学学生实验报告一、实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质3、了解什么是管道4、熟悉UNIX/LINUX支持的管道通信方式二、实验器材1、计算机一台。
2、Linux三、实验内容1、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
3、编写程序实现进程的管道通信。
用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。
四、实验步骤、记录和结果实验二进程管理实验(一)进程的创建实验1.使用vi输入下面代码编译运行结果:从执行情况来看,可能输出bac,bca...2.使用vi输入下面代码编译运行结果:分析原因:1、从进程并发执行来看,各种情况都有可能。
上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。
输出次序带有随机性。
2、由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。
但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
这与打印单字符的结果相同。
实验总结:通过这次实验,即时在多进程中printf()在输出字符串时不会被中断。
操作系统实验报告进程通信管理资料

漳州师范学院
实验报告
班级 13网络1班学号1308990337 姓名成绩
理解分析:1.先创建父进程,由父进程分别产生子进程1和子进程
p2,parent。
2.给父进程中断信号,父进程开始终止子进程,signal(SIGINT, SIG_IGN);语句,相当于使子进程忽略键入信号,不会将子进程终止,程序可以正常运行。
于是输出child process by parent!和child process 2 is killed by parent!
理解分析:在该管道通信中,有时是子进程p1,p2往管道中传送数据完后父进程再从管道中读取数据,有时是子进程p1往管道中传送数据后父进程从管道中读取数据,然后子进程p2再往管道中传送数据,父进程再从管道中读取数据。
1)管道通信的概念是什么
管道通信即发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信。
2)同步和互斥的概念是什么,在程序中如何实现的
注:如果填写内容超出表格,自行添加附页。
操作系统实验2-计算机操作系统(第3版)-郁红英-清华大学出版社

操作系统实验
(课程设计)实验报告
学院
专业
班级/学号
学生姓名
成绩
实验地点_
实验日期___ __
指导教师_____ ___ _____
(课程上机)实验报告
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
实验一 进程通信操作系统实验报告

验
内
容
2.用pipe()创建一个管道,然后用fork()创建两个生产进程和两个消费进程,它们之间能过pipe()传递信息。
实
验
结果
遇到问题及解决方法
int i,pid,status;
for(i=0;i<4;i++) pid=wait(*status); i,pid,status;
实
验
结果
遇到问题及解决方法
retval=clone((void*)producer,&(stack[4095]),clone_flag, (void*&arg);此语句void*后缺少),正确语句应为:
retval=clone((void*)producer,&(stack[4095]),clone_flag, (void*)&arg);
for(i=0;i<4;i++) pid=wait(&status);
if(id==1) stcopy(w_buf,"ccc\0");
else strcpy(w_buf,"ddd\0");
此语句中stcopy词语写错,应改为strcpy,即
if(id==1) strcpy(w_buf,"ccc\0");
学年第学期
操作系统课程
实验报告
学院:
专业:
班级:
姓名:
学号:
任课教师:
实验日期:2017年4月11日
实验题目
实验一进程通信
实验地点
实验目的
1.理解Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据的过程。
操作系统实验报告进程通信管理

2.给父进程中 断信号, 父进程开始 终止子进程,但是由于 添加了
signal(SIGINT, SIG_IGN);
2.
编制一段程序,实现进程的管道通信。使用系统调用
Child
Child 2 is sending a message!
而父进程则从管道中读出来自两个子进程的信息,显示在屏幕上。
漳州师范学院
实验报告
班 级
同组人
课程名称:操作系统
实验题目:进程通信管理
实验目的与要求
1.加深理解进程并发执行的概念,认识多进程并发执行的实质;
2.观察进程争夺资源的现象,分析其进程和原因,学习解决进程互斥 的方法;
3.了解Linux系统中多进程之间通过软中断通信以及管道通信基本原 理和应用方法;
实 验 环 境 的 配 置
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
1
理解分析:1.先创建父进程,由父进程分别产生子进程1和子进程2,依次输出pl,
p2,pare nt。
2.给父进程中断信号,父进程终止子进程,运行stop函数wait_mark=O;跳
出wait ing函数,输出pare nt process is killed!
PC兼容机。Window xp以上操作系统
第1页
闽南师范大学
1.软中断通信
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信 号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信 号后,分别输出下列信息后终止:
进程之间的通信实验
实验:进程之间的通信管道1.Pipe函数与进程通信下面实验为使用管道进行父子进程间通信。
程序首先判断参数是否合法,因为输入的字符将从父进程通过发送到子进程中。
然后,调用pipe函数创建父子进程用于通信的管道。
使用fork函数创建子进程时,子进程会获得与父进程相同的资源,其中包括文件描述符信息。
因此,调用fork函数须在pipe函数调用前。
当父子进程通过管道进行通信时,files[1]为用于数据写入的文件描述符.因此,在子进程中,要读取管道中的数据可以调用read函数,而读取得文件描述符为files[0]。
对于父进程而言,写入数据需要调用write 函数,要写入的文件描述为files[1]。
#include <stdio.h>#include <unistd.h>int main(int argc,char* argv[]){int f_des[2];int pid;char msg[BUFSIZ];if(argc!=2){printf("Usage: %s message\n",argv[0]);return 1;}if(pipe(f_des)==-1){perror("cannot create the IPC pipe");return 1;}pid=fork();if(pid==-1){perror("cannot create new process");return 1;}else if(pid==0){close(f_des[1]);if(read(f_des[0],msg,BUFSIZ)==-1){perror("child process cannot read data from pipe");return 1;}elseprintf("in child process, receive message: %s\n",msg);_exit(0);}else {close(f_des[0]);if(write(f_des[1],argv[1],strlen(argv[1]))==-1){perror("parent process cannot write data to pipe");return 1;}elseprintf("in parent process, send message: %s\n",argv[1]);wait(NULL);_exit(0);}return 0;}2. Shell管道重订向的实现实现了在SHELL中的两个命令的组合。
管道通信实验
院系:计算机系
姓名:李
学号:10
专业:科学技术
年级:10级
实验题目:管道通信实验
一、实验目的(包括:实验内容、实验原理、实验目标)
1、了解管道的基本概念
2、掌握Linux支持的管道通信方式
二、实验设计(包括:设计思路、数据结构、程序流程图、关键代码说明)
本实验利用管道通信机制,实现输入字符串的自动分流操作。一共涉及3个管道,4个进程。P1:从键盘接受输入字符串,写入管道pipe1
{
close(d1[1]); //p1必须关闭写
read(d1[0],buff,sizeof(buff)); //p2从pipe1中读信息
if(strlen(buff)%2==1) //判断字符串长度,若为奇数
{
j=fork(); //创建子进程P3
if(j) //P3执行
}
}
三、实验结果(包括:运行结果、结果分析)
教师评语
成绩:教室签名:年月日
Please input a string: apple
P2 finishes writing to pipe2.
P3 pipe2 odd length string:apple
Please input a string: pear
P2 finishes writing to pipe3.
P4 pipe3 even length string:pear
P2:从pipe1接受字符串,若字符串的长度为偶数,则将其写入管道pipe2,负责写入管道pipe3.P3:从pipe2读出字符串,并显示pipe2:Even length string:偶长度字符串。P4:从pipe3读出字符串,并显示pipe3:Old length string:奇长度字符串。输入exit程序退出,示意图如下图1.1
进程的软中断通信与管道通信
实验二进程的软中断通信与管道通信一、实验目的:1、进一步认识并发执行的实质;2、分析进程争用资源的现象,学习解决进程互斥的方法;3、了解Linux 系统中进程通信的基本原理。
二、实验内容及要求:1、进程软中断通信:调用kill及signal函数编写一个程序,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程。
2、进程管道通信:编写一个程序,建立一个pipe,同时父进程产生一个子进程,子进程向pipe中写入一个字符串,父进程从中读出,并每隔3秒输出打印一次。
实验程序框图:1、软中断通信:2、管道通信(即:cool函数功能):四、实验程序:#include<stdio.h> #include<stdlib.h> #include<unistd.h> void cool( ); --函数申明main( ){ int jincheng;while((jincheng=fork()) ==-1); --建立子进程,不成功则空循环if(jincheng==0) --建立子进程成功{ printf("\n the child's pid is %d\n",getpid());--输出打印子进程id值signal(17,cool); --接收父进程发来的信号sleep(5); --等待5秒exit(0); --自我终止}else{printf("\n the parent's pid is %d\n",getpid());--输出打印父进程id值sleep(1); --等待1秒printf("\n child,I have sent a signal.\n"); --通知子进程kill(jincheng,17); --发送信号给子进程wait(0); --等待子进程结束}}void cool( ){ int guandao[2],pid,i;char output[70],input[70];printf("\n yes,father!I have recieved the signal.\n)"; --子进程收到信号pipe(guandao); --建立管道while((pid=fork())==-1); --建立子进程,不成功则空循环if(pid==0) --建立子进程成功{ sprintf(output,"\n father,I am sending message!\n)"; --写字符串write(guandao[1],output,40);exit(0); --自我终止}else{ wait(0); --等待子进程结束read(guandao[0],input,40);for(i=0;i<4;i++){ printf("\n %s" ,input);sleep(3);}exit(0); --进程终止--向写管道里写字符串--从读管道里读字符串--打印四次--输出打印字符串--等待3秒五、实验运行结果:六、实验心得:通过这次实验,让我了解了Linux中编译器的使用,对Linux进程的管理有了进一步的认识,学会了一些函数的应用。
实验四 进程管道通信
(2)读管道 在管道创建后,希望从管道中读取数据的进程使用 读文件描述符fd[0]作为参数,调用read( )系统调用。 #include <unistd.h> ssize_t read(int fd,void *buf,size_t nbytes); 返回:读到的字节数,若已到文件尾为0,若出错为-1。 (3)写管道 向管道中写入数据的进程使用写文件描述符fd[1]作 为参数,调用write( )系统调用。 #include <unistd.h> ssize_t write(int fd,const void *buf,size_t nbytes); 返回:若成功为已写的字节数,若出错为-1。
管道分为无名管道和有名管道。无名管道没有 名字,所以只能提供给进程家族中的父子进程间通 信使用,而有名管道则用于没有家族关系的任意两 个进程之间的通信。 实现无名管道的传统方法是利用文件系统机制, 把管道看作是一个打开的文件, 因此它有一个i节点和两个文件表项。 (1)创建一个管道 管道是由使用pipe系统调用而创建的。#include <unistd.h> int pipe(int fd[2]); 返回:成功为0,出错为-1 经由参数fd[]返回两个文件描述符:fd[0]为读端, fd[1]为写端。
操作系统实验指导 -以Linux系统为主
实验四 进程的管道通信
一、实验目的 (1)了解Linux系统中进程通信的基本原理。 (2)了解和掌握管道通信机制。 二、实验预备知识 管道是UNIX系统中最早为两个进程之间提供 的一种通信机制。管道是一种单向的、先入先出的、 无结构的、大小固定的通信通道。写进程在管道的 一端写入数据,读进程从管道的另一端读出数据。 如果两个或多个进程同时对一个进程进行读பைடு நூலகம்,那 么这些进程必须使用锁机制或者信号量机制对其进 行同步。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
{
wait(0);
if((r=read(fd[0],s,50))==-1)
printf("can not read pipe\n");
else printf("%s\n",s);
}
}
\\创建管道
\\创建子进程p1
\\p1抢上CPU
\\p1将字符串写入管道
\\撤销进程
\\父进程抢上CPU
内蒙古师大计算机与信息工程学院
《操作系统》课程实验报告
实习题目
实验二
基于管道的进程通信
指导教师
职称
学生姓名
学号
日期
实现工具
C语言
实现环境
Linux
实习内容(功能、目标)
内容:
编写一段程序,使用系统调用pipe()创建一无名管道,同时父进程创建一个子进程p1;并使子进程通过管道向父进程传递数据“p1 process is sending data to father.”,父进程通过管道接收到该字符串后输出。
char buf[50],s[50];
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
{
sprintf(buf,"p1is sending data to father.");
printf("childp1!\n");
write(fd[1],buf,50);
sleep(5);
\\父进程从管道中读取字符串失败
\\读取成功输出字符串
结果分析(含实现中出错原因分析)
思考问题:
(1)为什么要在父进程与子进程之间通过管道同步传递数据?不同步而任意写入或读取数据结果如何?
答:因为子进程将字符串写入管道向父进程发出信号,然后父进程从管道中读取字符串。不同步有可能不能读到字符串。
(2)若两个子进程通过管道分别向父进进程传递数据,则如何实现,同时注意查看执行结果,父进程读取各子进程传来的数据顺序如何?(注意各子进程间利用lockf()加锁互斥向管道写入数据)
目的:
创建无名管道,实现基于管道的进程间数据通信,掌握管道通信的方法及特征;并进一步理解互斥与同步的含义。
要求:
(1)掌握系统调用pipe()的使用方法及其功能,理解管道通信原理;
(2)掌握利用系统调用exit()和wait()实现父进程与子进程之间的同步,理解同步的含义。
实现的思想、方法和技术(含数据结构、算法)
答:两个子进程互斥的将信息写入管道。,子进程与父进程仍是同步指导教师评语、评分评源自:指导教师:年月日
1.通过管道实现子进程和父进程之间的通信。
2.子进程与父进程之间实现同步。
3.子进程将信息写入管道并向父进程发出信号,父进程接到信号后从管道中读取信息,并将信息输出,如果读取失败则输出“读取失败”
主要代码
注释
#include<stdio.h>
#include<stdlib.h>
main()
{
int r,p1,fd[2];