`

IPC PIPE

 
阅读更多

管道

<!--[if !supportLists]-->1、<!--[endif]-->函数列表

<!--[if !supportLists]-->Ø <!--[endif]-->int pipe(int filedes[2])//#include <unistd.h>

创建一个管道,返回的两个文件描述字filedes[0]filedes[1]代表了管道,管道将以此两个文件描述字被使用。其中filedes[0]用来读,filedes[1]用来写。

有权限的每个进程都可以使用管道,因此对于每个进程而言,都拥有此管道的两个文件描述字,用于读写管道。且一个进程中对文件描述字的操作(例如关闭)不影响其它进程中对此管道的使用。

下面的图示单个进程和两个进程中的管道。

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:356.25pt; height:127.5pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:297pt;height:132pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

<!--[if !supportLists]-->Ø <!--[endif]-->ssize_t write(int fd, const void *buf, size_t count);

<!--[if !supportLists]-->Ø <!--[endif]-->ssize_t read(int fd, void *buf, size_t count);

<!--[if !supportLists]-->Ø <!--[endif]-->int close(int fd); //#include <unistd.h>

操作文件(广义的:包括普通文件、系统设备和管道)的读写关闭函数。其中fd为文件描述字。

<!--[if !supportLists]-->Ø <!--[endif]-->FILE *popen(const char *command, const char *type); // #include <stdio.h>

调用进程调用此函数,此函数将创建一个进程(shell命令进程)。其中command为具体的shell命令行,type的含义如下:

“r”:调用进程对管道进行读操作,读取的内容是shell命令行的执行结果;

“w”:调用进程对管道进行写操作,shell命令行进程对管道进行读操作;

<!--[if !supportLists]-->Ø <!--[endif]-->int pclose(FILE *stream);

关闭由popen打开的文件。

<!--[if !supportLists]-->2、 <!--[endif]-->实例解析

<!--[if !supportLists]-->Ø <!--[endif]-->simplepipe

单管道半双工双进程程序,父进程向管道写进数据,子进程读取数据。

<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:335.25pt;height:140.25pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

<!--[if !supportLists]-->Ø <!--[endif]-->mainpipe

双管道半双工双进程,父进程对pipe1写进文件路径名,子进程对pipe1读取文件路径名,然后子进程对pipe2写进文件内容,最后父进程对pipe2读取文件内容。

<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:414.75pt;height:195.75pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

mainpipe.c作用:

创建子进程,关闭两进程对应的管道文件描述字,具体如下:

父进程关闭 fd1[0]fd2[1];

子进程关闭 fd1[1]fd[0];

然后调用serverclient函数,实现读写管道。

server.c作用:

子进程对pipe1读取路径名,对pipe2写进文件内容

while ( (n = Read(fd, buff, MAXLINE)) > 0)

Write(writefd, buff, n);

//不断地读取文件的内容,并对pipe2写进文件的内容

//因为文件内容可能很大,需要多次的写pipe2

client.c作用:

父进程对pipe1写进路径名,对pipe2读取文件内容

while ( (n = Read(readfd, buff, MAXLINE)) > 0)

Write(STDOUT_FILENO, buff, n);

//不断地对pipe2读取数据

//因为有进程(子进程)在不断地向pipe2写进数据

<!--[if !supportLists]-->Ø <!--[endif]-->mainpopen

popen函数创建管道,特点是方便用于与shell命令之间的数据交互;隐藏了进程创建的细节。

FILE *fp;

snprintf(command, sizeof(command), "cat %s", buff);

fp = Popen(command, "r");

//创建管道,调用进程对管道读操作,取得cat命令的内容,保存在fp文件中

while (Fgets(buff, MAXLINE, fp) != NULL)

//取出fp文件中的内容

{

printf("buff after popen==%s/n",buff);

Fputs(buff, stdout);

//输出到标准输出

}

<!--[if !supportLists]-->3、 <!--[endif]-->小结

<!--[if !supportLists]-->Ø <!--[endif]-->管道用于有亲缘关系的进程(父子进程)间进行数据交互

<!--[if !supportLists]-->Ø <!--[endif]-->一个管道有两个文件描述字,对管道有操作权限的每个进程都拥有自己的两个文件描述字,且一个进程对其文件描述字的操作(例如关闭)不影响其它进程对应的文件描述字

<!--[if !supportLists]-->Ø <!--[endif]-->创建管道的方式有两种:pipepopen。其中后者专门用于与shell命令行进行交互;

<!--[if !supportLists]-->Ø <!--[endif]-->全双工的管道实际上是对两个文件操作字都有了读和写的操作。在半双工管道使用过程中,要关闭不使用的文件描述字。

分享到:
评论

相关推荐

    C例子:IPC-pipe

    该程序是我写的博客“一起talk C栗子吧(第八十八回:C语言实例--使用管道进行进程间通信一)”的配套程序,共享给大家使用

    Linux进程间通信之管道

    管道(Pipe)是Linux IPC机制的一种,它允许有亲缘关系的进程之间进行单向数据传递。在这个场景下,我们讨论的是“Linux进程间通信之管道”,这个主题通常涉及到创建管道、数据传输以及父子进程之间的通信。 首先,...

    C例子:IPC-pipe3

    该程序是我写的博客“一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)”的配套程序,共享给大家使用

    C例子:IPC-pipe2

    该程序是我写的博客“一起talk C栗子吧(第八十九回:C语言实例--使用管道进行进程间通信二)”的配套程序,共享给大家使用

    C++ 命名管道 IPC 进程通信 例子

    在本主题中,我们将深入探讨C++如何使用命名管道(Named Pipe)进行IPC,这是一种高效且灵活的通信机制。命名管道在Windows操作系统中被广泛使用,它为不同进程提供了一种半双工(半同步/半异步)通信方式。 命名...

    Named-pipe communication for IPC (CSNamedPipeCommunication) - VS2012

    标题中的“Named-pipe communication for IPC (CSNamedPipeCommunication) - VS2012”指的是在Visual Studio 2012环境下使用C#语言实现的一种跨进程通信(IPC,Inter-Process Communication)技术,即命名管道。...

    自己写IPC的Demo

    常见的IPC机制有管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)、套接字(Socket)等。 IPCServer和IPCClient的文件名暗示了这是一个基于客户端-服务器架构的IPC实现。...

    ipc.rar_IPC_IPC Linux_ipc 进程通信_linux ipc_linux 多进程

    Linux中的IPC主要包括信号量(Semaphore)、消息队列(Message Queue)、共享内存(Shared Memory)、管道(Pipe)、套接字(Socket)等。 2. **信号量(Semaphore)**: - 信号量是一种同步工具,用于控制对临界...

    多进程构成pipe-ring, 实现pipe sorting

    在IT领域,多进程通信是实现复杂系统设计的关键技术之一,而管道(pipe)作为早期UNIX系统中引入的进程间通信(IPC, Inter-Process Communication)机制,被广泛应用于数据交换。本文将深入探讨“多进程构成pipe-...

    FIFO配合管道PIPE,实现FIFO传递数据,PIPE触发epoll,异步IO效果

    在IT行业中,FIFO(First In First Out)和管道(PIPE)是进程间通信(IPC,Inter-Process Communication)的两种重要方式。FIFO是一种特殊的文件类型,它遵循先进先出的原则,允许不同进程通过文件系统进行数据交换...

    NamePipe.zip

    命名管道(NamePipe)是Windows操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,它允许不同的进程之间交换数据。在这个“NamePipe.zip”压缩包中,包含了一个名为“NamePipe”的C++实现,...

    mpipe.rar

    在众多的IPC方式中,管道(Pipe)是一种简单而实用的机制。本文将以“mpipe”为例,深入探讨多进程管道通信的实现原理,并通过分析源码“mpipe.cpp”,来解析其具体操作流程。 首先,我们理解“mpipe”这个名字的...

    IPC起源及发展过程简介

    2. **多道程序系统**:随着多道程序系统的出现,进程间通信的需求增加,共享内存和管道(pipe)成为主要的IPC方式。共享内存允许进程直接访问同一块内存,而管道则是单向的数据流通道。 3. **UNIX系统的贡献**:在...

    Unix IPC简介

    ### Unix IPC简介 #### 1. 管道 (Pipe) 管道是一种进程间通信机制,主要用于父子进程之间的通信。管道可以实现数据从一个进程到另一个进程的单向传输,适用于普通文件的数据通信。如果需要传递特殊的文件描述符,...

    android IPC及原理简介

    首先,Linux系统提供了多种传统的IPC方式,如socket、命名管道(named pipe)、消息队列(message queue)、信号(signal)以及共享内存(share memory)。这些机制在Java系统中同样适用,包括Android应用程序。然而...

    ipc.c.rar_IPC_ipc编写程序

    这表明这个项目可能包含了一些基本的IPC机制,如管道(pipe)、信号量(semaphore)、共享内存(shared memory)或者消息队列(message queue)等,这些都是进程间通信的常见方法。 标签"ipc ipc编写程序"进一步...

    python pipe 库 library

    Python的pipe库是一个非常实用的工具,特别是在处理进程间通信(IPC, Inter-Process Communication)时。这个库允许我们创建管道来传输数据,这在多线程或多进程编程中非常常见,尤其是在需要不同进程间共享数据的...

    posix ipc python库源码

    `NamedPipe`类提供了创建、读写管道的方法,如`mkfifo`用于创建管道,`open`用于打开管道,`read`和`write`用于数据传输。 5. **线程安全(Thread Safety)**:`posix_ipc`库的设计考虑了多线程环境,因此它的所有...

    linux ipc的简单使用

    此外,Linux IPC还包括其他几种机制,如信号量(semaphore)用于同步访问资源,共享内存(shared memory)允许多个进程直接共享内存区域,以及管道(pipe)和套接字(socket)等。每种机制都有其独特的应用场景和...

    6_pipe_fifo

    本文将详细探讨两种常见的IPC机制:pipe(管道)和fifo(无名管道),并结合提供的源码文件"6_pipe"和"6_fifo"进行深入解析。 1. **管道(Pipe)** - **概念**:管道是一种半双工的通信方式,允许数据在一个方向上...

Global site tag (gtag.js) - Google Analytics