操作系统管道通信
OS7(管程通信线程)

操作系统
7/25
Lifang ©2010
2)管程描述 2)管程描述
type producer-consumer=monitor var in,out,count:integer; buffer: array [0..n-1] of item; notfull, notempty: condition; procedure entry put(item) begin if count≥n then notfull.wait; One unit buffer; count:=count+1; if notempty.queue then notempty.signal; end
进程1写入
进程2读出
操作系统
14/25 14/25
Lifang ©2010
管道通信
写 端 pipe( fd ) fd[1] write(fd[1],buf,size) 读 fd[0] 端 read(fd[0],buf,size)
pipe可建立一条同步通信管道 其格式: 可建立一条同步通信管道, 系统调 用pipe可建立一条同步通信管道,其格式: pipe(fd); int fd[2]; 其中: fd[1]为写入端 fd[0]为读出端 为写入端, 为读出端。 其中: fd[1]为写入端, fd[0]为读出端。
操作系统 9/25 Lifang ©2010
பைடு நூலகம்
3、 管程和进程的异同点
• 设置进程和管程的目的不同 • 系统管理数据结构 –进程:PCB 进程: 进程 –管程:等待队列 管程: 管程 • 管程被进程调用 • 管程是编程语言概念,编译器必须识别出管程,并 管程是编程语言概念,编译器必须识别出管程, 用某种方式对互斥做出安排, 用某种方式对互斥做出安排,只有少数的语言设有 管程: 管程:Java,C#... ,
windows管道原理

windows管道原理一、引言Windows管道是Windows操作系统中用于进程间通信的一种重要机制。
它提供了一种简单、高效的方式来在进程间传递数据,使得不同的进程可以协同工作,提高系统的整体性能。
本篇文章将详细介绍Windows管道的工作原理,包括其组成、工作流程、性能特点等。
二、管道概述Windows管道是一种基于内存的通信机制,它由一个发送端和一个接收端组成。
发送端负责将数据写入管道,而接收端则从管道中读取数据。
管道适用于不同进程之间的通信,因为它们共享相同的地址空间,使得数据可以在进程间自由传输。
三、管道组成1.管道缓冲区:用于存储从发送端写入的数据和从接收端读取的数据。
2.管道描述符:用于标识管道的句柄,可以用于打开、关闭、读、写等操作。
3.发送端和接收端进程:负责与管道进行交互的进程。
四、工作流程1.发送端将数据写入管道缓冲区:发送端将数据写入管道后,数据会被复制到发送端的进程空间中。
2.数据在管道缓冲区中排队:当接收端尝试从管道读取数据时,它会检查缓冲区中是否有可用的数据。
如果有,则从缓冲区中读取数据;如果没有,则等待数据到达。
3.数据到达后,接收端从管道中读取数据:当数据到达管道时,接收端会检查是否有可用的缓冲区空间来存储数据。
如果有,则从管道中读取数据并将其存储在接收端的进程空间中。
4.数据传递完成后,发送端和接收端进程继续执行其他任务:当数据在管道中传递完成后,发送端和接收端进程可以继续执行其他任务。
五、性能特点1.高效率:由于管道是基于内存的通信机制,数据在管道中的传输速度较快,避免了传统的通信机制(如消息队列、共享内存等)中可能出现的阻塞和延迟问题。
2.跨平台支持:Windows管道可以在不同的操作系统平台上使用,具有良好的跨平台兼容性。
3.简单易用:Windows管道提供了一组简单的API,使得开发者可以轻松地使用管道进行进程间通信。
4.可扩展性:Windows管道支持多路复用和分流机制,可以根据实际需求灵活地扩展管道的数量和容量。
操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
进程通信的几种方法

进程通信的几种方法进程通信是指在操作系统中,不同的进程之间进行数据交换和信息传递的过程。
在现代操作系统中,进程通信是非常重要的,因为多个进程之间的协作可以提高系统的性能和效率。
本文将介绍几种常见的进程通信方法。
1.管道通信管道通信是一种单向、半双工的通信方式,通过创建一个管道,将一个进程的输出连接到另一个进程的输入,从而实现数据的传输。
管道通信一般用于具有父子关系的进程之间或者具有共同祖先的进程之间。
2.消息队列通信消息队列通信是一种通过操作系统内核来传递消息的机制。
进程可以将消息发送到消息队列,其他进程则可以从消息队列中接收消息。
消息队列通信具有高效、可靠、灵活等特点,常用于进程之间传递数据量较大的情况。
3.共享内存通信共享内存通信是一种进程间共享内存区域的方式。
多个进程可以访问同一块内存区域,从而实现数据的共享。
共享内存通信的优点是速度快,因为进程之间不需要进行数据的复制,但是需要进程之间进行同步和互斥操作,以避免数据的冲突。
4.信号量通信信号量通信是一种通过操作系统提供的信号量机制来实现进程间同步和互斥的方式。
进程可以通过信号量来进行互斥操作,以确保共享资源的安全访问。
信号量通信常用于进程之间共享资源的管理和同步。
5.套接字通信套接字通信是一种通过网络进行进程通信的方式,常用于不同主机之间的进程通信。
套接字通信可以通过TCP或UDP协议来实现,具有跨平台、可靠性高等特点。
总结起来,进程通信是操作系统中非常重要的一部分,不同的进程之间可以通过各种方式进行数据的交换和信息的传递。
管道通信、消息队列通信、共享内存通信、信号量通信和套接字通信是常见的几种进程通信方法。
不同的通信方法适用于不同的场景,开发人员需要根据具体需求选择合适的通信方式。
进程通信的正确使用可以提高系统的性能和效率,确保系统的稳定运行。
操作系统进程通信

进程通信-----消息传递通信的实现方式
通信链路:
第一种方式(主要用于计算机网络中):由发送进程在通信 之前用显式的“建立连接”命令请求系统为之建立一条通 信链路,在链路使用完后拆除链路。
第二种方式(主要用于单机系统中):发送进程无须明确提 出建立链路的请求,只须利用系统提供的发送命令(原 语),系统会自动地为之建立一条链路。
邮箱特点: (1)每一个邮箱有一个唯一的标识符; (2)消息在邮箱中可以安全保存,只允许核准的用户随时
读取; (3)利用邮箱可以实现实时通信,又可以实现非实时通信。
进程通信-----信箱通信
信箱结构:
信箱定义为一种数据结构,在逻辑上可以分为:
• 1,信箱头,用以存放有关信箱的描述信息,如信箱标识符,信箱的 拥有者,信箱口令,信箱的空格数等;
基于共享存储区的通信方式。在存储器中划出了一 块共享存储区,各进程可通过对共享存储区中的 数据的读和写来实现通信。适用于传输大量数据。
进程通信-----消息传递系统
消息传递机制 : 进程间的数据交换以消息为单位,程序员利用系统的通信原语(要
进行消息传递时执行send;当接收者要接收消息时执行receive)实 现通信。这种通信方式属于高级通信 。
b 接 收 区
原语描述
二、实例—消息缓冲队列通信机制
1、通信描述
PCB(B)
进程 A
进程 B
send (B,a)
mq mutex
sm
receive(b)
Emphead
a 发 sender: A 送 size:5 区 text:Hello
sender : A size : 5
i Text:Hello next: 0
操作系统进程通信报告

实验四:进程同步实验一、实验任务:1、熟悉操作系统进程通信原理2、设计程序,实现共享内存、管道通信、消息通信二、实验原理:1、进程间通信的几种方法简介(1)消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。
有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
(2)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。
是针对其他通信机制运行效率较低而设计的。
往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(3)无名管道(Pipe)及有名管道(named pipe):有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;无名管道可用于有亲缘关系的进程之间彼此的通信,进行通信时候必须有一定的机制保证对管道写和读的互斥:即在读是要关闭写的端口,而在写的时候也要保证读的一端是关闭的。
2、进程通信函数(1)消息队列有关系统调用函数a.创建消息队列使用msgget()函数:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int flag) ;该函数成功调用返回消息队列标识符。
其中的key是关键字,可以由ftok()函数得到:key=ftok(“.”,’a’);其中”.”可以是任何目录,’a’是任意字符,即所有群组标识。
flag是标识,IPC_CREAT位表示创建,一般由服务器程序创建消息队列时使用。
如果是客户程序,必须打开现存的消息队列,必须不使用IPC_CREAT。
发送和接收的消息都必须使用一个类似msgbuf的结构表示,msgbuf结构定义如下:struct msgbuf{long mtype;char mtext[1];}上面的定义,消息内容只有一个字节,是不实用的,一般我们需要重新定义一个结构:struct amsgbuf{long mtype;char mtext[200];}其中的mtype都是消息类型。
操作系统 进程的管道通信 实验报告
实验内容与步骤:
编写程序实现进程的管道通信。用系统调用pipe( )建立一管道, 二个子进程P1和P2分别向管道各写一句话:
Child P1 is sending a message!
Child P2 is sending a message!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1, 后P2)。
进程的管道通信实验报告
学号
姓名
时间
2011年11月18日
专业
网络工程
班级
5班
实验题目:进程的管道通信实验
实验目的:
1.了解什么是管道
2.熟悉UNIX/LINUX支持的管道通信方式
3.通过进程多次的循环读写学习利用管道进行进程间的通信
4.验证lockf的加锁解锁作用
5.验证读写进程本身是否已经实现了互斥作用
2.熟悉UNIX/LINUX支持的管道通信方式, 并在程序中运用了pipe(), read()和write()等系统调用。
3、验证了lockf的加锁解锁作用, 并验证了读写进程互斥。
4、进程中sleep(5)的作用是让所显示的内容休眠5秒钟,即等待5秒钟再显示。进程1和进程2也能对管道进行操作,因为他们同属于共同的管道,共同共享资源。
printf("%s\n", InPipe);
}
exit(0);
}
}
return 0;
}
运行结果如下:
分析与体会:
1.通过本实验, 我了解到所谓管道, 是指能够连接一个写进程和一个读进程、并允许它们以生产者—消费者方式进行通信的一个共享文件, 又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道, 而读进程则从管道的读出端(句柄0)读出数据。并知道pipe文件的建立。
操作系统练习题+参考答案
操作系统练习题+参考答案一、单选题(共100题,每题1分,共100分)1、若系统中有5个并发进程涉及某个相同的变量A,则变量A的相关临界区由()个临界区构成。
A、1B、3C、5D、6正确答案:C2、在分页虚拟存储管理系统中,采用某些页面置换算法,会出现Belady 异常现象,即进程的缺页次数会随着分配给该进程的页面数量的增加而增加。
下列算法中,可能出现Belady现象的是()。
①LRU算法②FIFO 算法③OPT算法A、仅2B、仅1、2C、仅1、3D、仅2、3正确答案:A3、下列关于管道通信的叙述中,正确的是()。
A、一个管道可以实现双向数据传输B、管道的容量仅受磁盘容量大小的限制C、进程对管道进行读操作和写操作都可能被阻塞D、一个管道只能有一个读进程或一个写进程对其操作正确答案:C4、不属于基本操作系统的是()。
A、网络操作系统B、实时操作系统C、分时操作系统D、批处理操作系统正确答案:A5、采用SPOOLing技术的目的是()。
A、提高独占设备的利用率B、提高程序的运行速度C、提高主机的效率D、减轻用户的编程负担正确答案:A6、在()的控制下,计算机系统能及时处理由过程控制反馈的数据,并作出响应。
A、分时操作系统B、实时操作系统C、批处理操作系统D、多处理机操作系统正确答案:B7、在分页虚拟存储管理中,当发现要访问的页面不在主存时,则由硬件发出()。
A、输入输出中断B、时钟中断C、缺页中断D、越界中断正确答案:C8、()可以用来解决临界区问题。
A、时间片轮转算法B、银行家算法C、LRU算法D、Test正确答案:D9、可变分区存储管理系统中,若采用最佳适应分配算法,“空闲分区表”中的空闲区应该按()顺序排列。
A、地址从大到小B、大小从大到小C、地址从小到大D、大小从小到大正确答案:D10、进程从运行状态转换到阻塞状态可能是由于()。
A、现运行进程执行了signal操作B、现运行进程时间片用完C、现运行进程执行了wait操作D、进程调度程序的调度正确答案:C11、()不是进程的特征。
linux管道通信(C语言)
char buf_r[200];
memset(buf_r,0,sizeof(buf_r));
if(pipe(pipe_fd)<0;
return -1;
}
result=fork();
if(result<0){
printf("创建子进程失败");
Linux系统提供了丰富的进程通信手段,如信号、信号灯、管道、共享内存、消息队列等,能有效地完成多个进程间的信息共享和数据交换。管道作为最早的进程间通信机制之一,可以在进程之间提供简单的数据交换和通信功能。
2 管道技术简介
2.1 管道的概念及特点
管道分为无名管道和有名管道两种。无名管道可用于具有亲缘关系进程间的通信,如父子进程、兄弟进程。有名管道克服了管道没有名字的限制,允许无亲缘关系进程间的通信。本文应用的是无名管道通信机制。
exit(0);
}
else{
close(pipe_fd[0]);
if(write(pipe_fd[1],"**Hello world !**",17)!=-1)
printf("父进程向管道写入**Hello world !**\n");
if(write(pipe_fd[1]," **Welcome !**",15)!=-1)
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。
接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。
操作系统实验_实验1课案
广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室 2015年11月11日实验课操作系统成绩程名称实验项进程管理与进程通信指导老师陈康民目名称(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)进程管理(一)进程的创建实验一、实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质二、实验内容1、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
三、实验步骤1、编写一段程序,使用系统调用fork( )创建两个子进程。
代码:#include <stdio.h>main( ){int p1,p2;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0) putchar('b');else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0) putchar('c');else putchar('a');}}运行结果:bca,bac, abc ,……都有可能。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
代码:#include <stdio.h>main( ){int p1,p2,i;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0)for(i=0;i<10;i++)printf("daughter %d\n",i);else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0)for(i=0;i<10;i++)printf("son %d\n",i);elsefor(i=0;i<10;i++)printf("parent %d\n",i);}}结果:parent…son…daughter..daughter..或parent…son…parent…daughter…等四、分析原因除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序执行过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南城建学院《操作系统》课程设计说明书设计题目:管道通信专业:计算机科学与技术指导教师:邵国金郭猛薛冰班级: 0814102学号: 081410217姓名:金贺同组人:李乾坤邵光光计算机科学与工程系2011年1 月 10 日前言课程设计是检测学生课程效果的重要手段,是训练学生通过所学的知识解决实际问题的重要方式,同时也是实践性教学中的一个重要环节,它以某以课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让学生对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《操作系统》是一门重要的专业课,是计算机理论和应用的核心基础课程。
操作系统课程设计,是一次对多学知识的综合演练,要求学生在操作系统的设计理念、整体机构、模块划分、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解,同时,在课程设计方法以及上机操作等基本技能和科学作风方面收到比较系统和严格的训练。
在这次的课程设计中我们选择的题目是进程间通信消息机制的设计,实现消息的创建、发送和接收及在server端创建一个服务函数,从而形成C/S通讯模式。
消息机制是消息通过消息队列的方式进行进程间消息的传递,通过此次课程设计,全面理解消息机制进程间通信方法。
实现把死板的课本知识变得生动有趣,激发了学生的积极性。
把学过的计算机操作系统的知识强化,能够把课堂上的知识通过自己设计的程序表示出来,加深了岁理论知识的理解目的。
目录一、........................................................ .. (4)二、........................................................ .. (4)三、设计题目及要求......................................................... (4)(1)设计管道通信 (4)(2)设计命名管道 (4)四、总体设计.............................................................. .. (4)五、详细设计.............................................................. .. (6)1、实现管道通信 (6)2、命名管道设计 (8)六、调试与测试方法.............................................................. . (12)七、执行结果及分析.............................................................. . (13)八、源程序清单.............................................................. (14)九、心得体会.............................................................. . (19)十、参考文献.............................................................. . (19)三、系统环境1、硬件环境:Intel(R)Core (TM)2 Duo CPUE7200 @ 2.53GHz1.59GHz,2.00GB的内存2、软件环境Microsoft Windows XPProfesstonal版本 2002Service Pack 3四、设计目的利用UNIX系统提供的管道机制实现进程间的通信。
(1)管道通信。
利用pipe()和lockf()系统调用,编写程序,实现同族进程间的通信。
使用系统调用pipe()建立一条管道线;创建子进程P1,P2,…。
子进程Pi分别向管道各写信息,而父进程则从管道中读出来自于各子进程的信息,实现进程家族间无名管道通讯。
扩展之,使之成为客户/服务器模式,并完成一定的任务(自己定义)。
(2)命名管道通信:利用mkfifo(name,mode)或mknod(name,mode,0)创建一个命名管道,然后利用它和文件部分系统调用实现不同进程间的通信。
改造之,使之成为客户/服务器模式,并完成一定的任务(自己定义)。
五、总体设计1.fork()创建一个新进程。
用法:int fork()其中返回int取值意义如下:0:创建子进程,从子进程返回的id值>0:从父进程返回的子进程id值-1:创建失败2.lockf(files,function,size)用作锁定文件的某些段或者整个文件。
头文件:#include <unistd.h>参数定义:int lockf(files,function,size);int files,function;long size;其中:files是文件描述符;function是锁定和解锁;1表示锁定;0表示解锁;Size 是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。
3.read功能:从描述符为filedes的文件读信息。
用法:#include <unistd.h>ssize_t read(int filedes, void *buff, size_t nbytes) ;返回:读到的字节数,若已到文件尾为0,若出错为-1。
在UNIX/Linux 可重定义为:int read(int fd, char *buff, unsigned nbytes) ;4.write功能:向已打开的文件写数据。
用法:#include <unistd.h>ssize_t write(int filedes, const void * buff, size_t nbytes) ;返回值:若成功为已写入的字节数;出错为-1。
int write(int fd, char *buff, unsigned nbytes) ;文件位置指针文件位置指针:每个打开文件都有一个与其相关联的“当前位移量”。
是从文件开始处计算的字节数。
通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。
按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。
文件位置指针可以通过系统调用lseek来移动。
5.创建用mkfifo或mknod创建一个命名管道。
以mkfifo为例:#include <sys/types.h>#include <sys/stat.h>i nt mkfifo(const char *fifo_name, mode_t mode); //成功返回0,否则为-16 signal(sig,function)允许调用进程控制软中断信号的处理。
头文件:#include <signal.h>参数定义signal(sig,function)int sig;void(*function)(); 返回值:成功时返回旧的(以前)函数描述,失败时返回SIG_ERR 。
7、client 、server可以以client/server 方式使用FIFO 。
如果一个服务器有多个客户时,每个客户可通过一个well_known FIFO 服务器连接。
连接后可以通过well_known FIFO 向服务器发送请求,所发信息的长度必须≤PIPE_BUF (4096)。
流程图消息的创建、发送和接收示意图六详细设计1、实现管道通信编制一段程序,实现进程的管道通信。
使用系统调用pipe()建立一条管道线。
两个子进程p1和p2分别向管道各写一句话:child 1 is sending message!child 2 is sending message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
<程序>#include <stdio.h>main(){int i,r,p1,p2,fd[2];char buf[50],s[50];pipe(fd); //创建匿名管道,fd[0]为读端,fd[1]为写端//while((p1=fork())==-1); //创建子进程P1,直至成功为止(p1!=-1)//if(p1==0) //子进程P1执行逻辑//{lockf(fd[1],1,0); //锁定管道写端,保证写入数据的完整性//sprintf(buf,"child process P1 is sending messages!\n"); //在buf中填入准备写入管道的信息数据printf("child processP1!\n"); //打印“子进程P1正在运行” //write(fd[1],buf,50); //向管道写端fd[1]写入buf中的数据,写完后该数据即可以从读端fd[0]读出//sleep(5); //睡眠5秒//lockf(fd[1],0,0); //解锁管道写端//exit(0); //子进程P1退出//}else //主进程的执行逻辑//{while((p2=fork())==-1); //创建第二个子进程P2//if(p2==0) //子进程P2的执行逻辑//{lockf(fd[1],1,0); //锁定管道写端,保证数据写入完整//sprintf(buf,"child process P2 is sending messages!\n"); //在buf中填入准备写入管道的信息数据printf("child processP2!\n"); //打印“子进程P2正在运行” //write(fd[1],buf,50); //向管道写端fd[1]写入buf中的数据,写完后该数据即可从读端fd[0]读出//sleep(5); //睡眠5秒//lockf(fd[1],0,0); //解锁管道写端//exit(0); //子进程P2退出//}//以下为主进程执行逻辑//wait(0); //等待某个子进程退出//if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取P1或者P2写入的数据(视哪个子进程抢先执行到lockf函数)//{printf(:can't read pipe\n"); //读取失败,打印错误信息//}else{printf(:%s\n",s); //打印出读到的信息数据//}wait(0); //等待第二个子进程退出//if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取出P1或者P2写入的数据(视哪个子进程后执行到lockf函数)//{printf(:can't read pipe\n"); //读取失败,打印错误信息//}else{printf(:%s\n",s); //打印读取到的信息数据//}exit(0); //主进程退出//}}2、命名管道设计。