`
gstarwd
  • 浏览: 1536760 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

进程的管道通信

阅读更多

实验四 进程的管道通信

实验目的
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下进程管道通信.docx

    **实验四:Linux下进程管道通信** 实验的目标是理解和掌握Linux操作系统中进程间通信的管道机制,通过系统调用pipe()实现数据交换。管道是一种特殊类型的文件,它允许相关进程之间进行单向通信。在这个实验中,我们...

    linux 进程管道通信 实例

    在这个实例中,我们将深入理解“Linux进程管道通信”的概念,通过分析提供的`fork.c`源代码来阐述其工作原理。 **管道通信**是一种简单且高效的数据传输方式,它允许父子进程或者兄弟进程之间共享一个单向的、无名...

    嵌入式进程管道通信编程实现

    进程管道通信编程实现,嵌入式Linux。

    进程管道通信

    ### 进程管道通信知识点详解 #### 一、实验背景与目标 本实验旨在通过具体的编程实践,加深学生对进程间通信(IPC)机制之一——管道通信的理解,并掌握其具体实现方法。实验主要目的是: 1. **理解进程概念**:...

    进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2

    进程的管道通信 编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2 分别向管道各写一句话: Child1 is sending a message! Child2 is sending a message! 而父进程则从...

    简易进程管道通信,新程序与已开程序的沟通

    在给定的标题“简易进程管道通信,新程序与已开程序的沟通”中,我们讨论的是一个简单的进程通信机制,通过管道实现两个进程之间的数据传递。这种通信方式在多进程系统中尤为常见,特别是在需要确保系统资源有效利用...

    实验一 进程通信——管道和信号实验报告.doc

    本次实验是关于操作系统中的进程通信,主要涉及了进程的创建、控制、以及多种通信方式,包括信号通信和管道通信。通过实验,目的是加深对进程概念的理解,掌握并发执行的本质,并学习如何解决进程间的互斥问题。实验...

    操作系统实验四 进程的管道通信 实验报告

    实验结果表明,通过管道通信,进程P1和P2成功地将各自的消息传递给了父进程,父进程正确地从管道中读取并显示了这两个消息。这验证了管道通信机制的有效性。 总结起来,这个实验加深了对操作系统中进程通信的理解,...

    (修改版)进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2。

    两个子进程P1和P2分别向管道各写一句话: Message from Child l! Message from Child 2! 父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1发来的消息,然后再接收子进程P2...

    C#命名管道通信,与QT命名管道通信

    命名管道通信,与QT命名管道通信,C#与C#的通信

    进程的管道通信 实验报告

    ### 进程的管道通信实验知识点总结 #### 一、管道的基本概念 管道是一种用于进程间通信的方法,它实质上是一种特殊的文件,主要用于连接两个进程,使得一个进程(生产者)产生的数据可以传递给另一个进程(消费者)...

    java 进程间利用管道通信实例

    总结来说,这个"java 进程间利用管道通信实例"是一个展示如何在Java中使用管道进行进程间通信的教学项目。通过学习和理解这个例子,开发者可以更好地理解和运用这一基础的IPC技术,为构建多进程系统奠定基础。

    进程的软中断通信和管道通信

    进程的软中断通信和管道通信 在操作系统中,进程通信是指多个进程之间的信息交换和协作。进程通信的实现方法有很多,包括软中断通信和管道通信。本文将详细介绍这两种通信方法。 一、软中断通信 软中断通信是指...

    进程的管道通信实验 操作系统

    在本实验“进程的管道通信实验”中,我们将深入理解并实践这一概念,尤其是管道(Pipe)这种简单的IPC机制。管道通信是早期Unix系统中引入的一种半双工通信方式,它允许数据在一个方向上流动,即数据只能从一个进程...

    QT之进程和进程间通信(IPC)

    进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。 在 Qt 中,我们使用...

    进程控制 进程的管道通信

    编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话: Child 1 is sending message! Child 2 is sending message! 而父进程则从管道中读出来自于两个子...

    进程的软中断通信与管道通信

    接下来是进程管道通信。管道是一种半双工的通信方式,允许数据在一个方向上流动。在实验中,`pipe()`函数用于创建一个管道`guandao`,它包含两个文件描述符,一个用于写入,一个用于读取。父进程产生子进程,子进程...

    进程间软中断通信和管道通信

    为了实现上述的进程间软中断通信和管道通信,开发者需要具备扎实的Linux编程基础,了解信号处理、文件I/O和进程控制等概念。在实际应用中,还需要考虑同步和互斥问题,以避免数据竞争和死锁等并发问题。例如,使用`...

Global site tag (gtag.js) - Google Analytics