- 浏览: 1536687 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
实验四 进程的管道通信
实验目的
1、了解什么是管道
2、熟悉UNIX/LINUX支持的管道通信方式
实验内容
编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。
实验指导
一、什么是管道
UNIX系统在OS的发展上,最重要的贡献之一便是该系统首创了管道(pipe)。这也是UNIX系统的一大特色。
所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。
二、管道的类型:
1、有名管道
一
个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod(
)建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的
访问方式与访问其他文件一样,需先用open( )打开。
2、无名管道
一个临时文件。利用pipe( )建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe( )的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。
二种管道的读写方式是相同的,本文只讲无名管道。
3、pipe文件的建立
分配磁盘和内存索引结点、为读进程分配文件表项、为写进程分配文件表项、分配用户文件描述符
4、读/写进程互斥
内核为地址设置一个读指针和一个写指针,按先进先出顺序读、写。
为
使读、写进程互斥地访问pipe文件,需使各进程互斥地访问pipe文件索引结点中的直接地址项。因此,每次进程在访问pipe文件前,都需检查该索引文
件是否已被上锁。若是,进程便睡眠等待,否则,将其上锁,进行读/写。操作结束后解锁,并唤醒因该索引结点上锁而睡眠的进程。
三、所涉及的系统调用
1、pipe( )
建立一无名管道。
系统调用格式
pipe(filedes)
参数定义
int pipe(filedes);
int filedes[2];
其中,filedes[1]是写入端,filedes[0]是读出端。
该函数使用头文件如下:
#include <unistd.h> #inlcude <signal.h> #include <stdio.h>
2、read( )
系统调用格式
read(fd,buf,nbyte)
功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。
参数定义
int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte;
3、write( )
系统调用格式
read(fd,buf,nbyte)
功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。
参数定义同read( )。
四、参考程序
#include <unistd.h> #include <signal.h> #include <stdio.h> int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))= =-1); if(pid1= =0) { lockf(fd[1],1,0); sprintf(outpipe,"child 1 process is sending message!"); /*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))= =-1); if(pid2= =0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,"child 2 process is sending message!"); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); /*同步*/ read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf("%s\n",inpipe); wait(0); read(fd[0],inpipe,50); printf("%s\n",inpipe); exit(0); } } }
五、运行结果
延迟5秒后显示
child 1 process is sending message!
再延迟5秒
child 2 process is sending message!
六、思考题
1、程序中的sleep(5)起什么作用?
2、子进程1和2为什么也能对管道进行操作?
发表评论
-
Linux内核源码包的安装及编译zz
2009-12-15 20:58 4312http://my.donews.com/ecco2005/2 ... -
Linux内核Makefile文件(二)
2009-12-15 19:34 2459=== 6 体系Makefile文 ... -
Linux内核Makefile文件(一)
2009-12-15 19:34 1875本文是/Documentation/kbuild/make ... -
Linux加载模块命令
2009-12-15 19:28 2716安装模块insmod *.ko卸载 ... -
linux内核模块编程
2009-12-15 19:25 3610主题: linux内核模块的程序结构--模块加载函数(必须), ... -
编译linux内核~
2009-12-05 22:04 1425小菜鸟第一次编译linux内核。截图太多 。。不方便上传 = ... -
grub2 基础教程
2009-12-05 18:01 2795grub2基础教程-修订版 ... -
Ubuntu9.10版本没有了menu.lst文件!
2009-12-05 18:00 3156囧~现在都在grub下面配置了。 不过麦斯之前的men ... -
关于信号量与线程互斥锁的区别与实现
2009-11-30 14:37 2434之前一直没有怎么 ... -
Linux信号量线程控制
2009-11-30 14:31 3697线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁, ... -
信号量和自旋锁
2009-11-29 21:56 1674内核同步措施 ... -
Linux信号量semaphore编程实例
2009-11-29 21:20 6606本例示范Linux信号量的基本用法。该范例使用了两个线程分别对 ... -
Linux获取当前时间
2009-11-29 21:16 3694Linux获取当前时间 ... -
pthread库学习(2): 线程的同步,使用信号量
2009-11-29 20:55 2508先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印 ... -
信号量的基本思想
2009-11-29 20:17 1494信号量是1965荷兰Dijkstra 为了解决并发进程问题 ... -
多进程通信方式一:管道(PIPE)
2009-11-27 18:29 9124进程通信(IPC)的几种方式及比较 撰文:黄显国08 ... -
Linux下线程的挂起和恢复
2009-11-27 15:42 3759POSIX的Linux操作系统没有提供线程挂起和恢复的例程,在 ... -
Linux 编程之生成静态连接库
2009-11-27 15:41 1416静态库及动态库的建立 ... -
LInux高级编程 - 线程(Threads)
2009-11-27 15:40 1922LInux高级编程 - 线程(Threads) ... -
Linux下c开发 之 线程通信
2009-11-27 15:39 19761.Linux“线程” 进程与 ...
相关推荐
**实验四:Linux下进程管道通信** 实验的目标是理解和掌握Linux操作系统中进程间通信的管道机制,通过系统调用pipe()实现数据交换。管道是一种特殊类型的文件,它允许相关进程之间进行单向通信。在这个实验中,我们...
在这个实例中,我们将深入理解“Linux进程管道通信”的概念,通过分析提供的`fork.c`源代码来阐述其工作原理。 **管道通信**是一种简单且高效的数据传输方式,它允许父子进程或者兄弟进程之间共享一个单向的、无名...
进程管道通信编程实现,嵌入式Linux。
### 进程管道通信知识点详解 #### 一、实验背景与目标 本实验旨在通过具体的编程实践,加深学生对进程间通信(IPC)机制之一——管道通信的理解,并掌握其具体实现方法。实验主要目的是: 1. **理解进程概念**:...
进程的管道通信 编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2 分别向管道各写一句话: Child1 is sending a message! Child2 is sending a message! 而父进程则从...
在给定的标题“简易进程管道通信,新程序与已开程序的沟通”中,我们讨论的是一个简单的进程通信机制,通过管道实现两个进程之间的数据传递。这种通信方式在多进程系统中尤为常见,特别是在需要确保系统资源有效利用...
本次实验是关于操作系统中的进程通信,主要涉及了进程的创建、控制、以及多种通信方式,包括信号通信和管道通信。通过实验,目的是加深对进程概念的理解,掌握并发执行的本质,并学习如何解决进程间的互斥问题。实验...
实验结果表明,通过管道通信,进程P1和P2成功地将各自的消息传递给了父进程,父进程正确地从管道中读取并显示了这两个消息。这验证了管道通信机制的有效性。 总结起来,这个实验加深了对操作系统中进程通信的理解,...
两个子进程P1和P2分别向管道各写一句话: Message from Child l! Message from Child 2! 父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1发来的消息,然后再接收子进程P2...
命名管道通信,与QT命名管道通信,C#与C#的通信
### 进程的管道通信实验知识点总结 #### 一、管道的基本概念 管道是一种用于进程间通信的方法,它实质上是一种特殊的文件,主要用于连接两个进程,使得一个进程(生产者)产生的数据可以传递给另一个进程(消费者)...
总结来说,这个"java 进程间利用管道通信实例"是一个展示如何在Java中使用管道进行进程间通信的教学项目。通过学习和理解这个例子,开发者可以更好地理解和运用这一基础的IPC技术,为构建多进程系统奠定基础。
进程的软中断通信和管道通信 在操作系统中,进程通信是指多个进程之间的信息交换和协作。进程通信的实现方法有很多,包括软中断通信和管道通信。本文将详细介绍这两种通信方法。 一、软中断通信 软中断通信是指...
在本实验“进程的管道通信实验”中,我们将深入理解并实践这一概念,尤其是管道(Pipe)这种简单的IPC机制。管道通信是早期Unix系统中引入的一种半双工通信方式,它允许数据在一个方向上流动,即数据只能从一个进程...
进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。 在 Qt 中,我们使用...
编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话: Child 1 is sending message! Child 2 is sending message! 而父进程则从管道中读出来自于两个子...
接下来是进程管道通信。管道是一种半双工的通信方式,允许数据在一个方向上流动。在实验中,`pipe()`函数用于创建一个管道`guandao`,它包含两个文件描述符,一个用于写入,一个用于读取。父进程产生子进程,子进程...
为了实现上述的进程间软中断通信和管道通信,开发者需要具备扎实的Linux编程基础,了解信号处理、文件I/O和进程控制等概念。在实际应用中,还需要考虑同步和互斥问题,以避免数据竞争和死锁等并发问题。例如,使用`...