精华内容
下载资源
问答
  • 管道 PIPE

    2016-04-21 09:00:59
    没错,就讲大家可能天天会用的“管道 | “,前者的输出是后者的输入。大家忽略了的一个有趣的事实是,后者不用得到前者执行完毕才启动。更有趣的是,只要后者获取了足够的数据,前者便会停止执行。

    没错,就讲大家可能天天会用的“管道 | “,前者的输出是后者的输入。这里简单要提一点大家可能忽略了的一个有趣事实是,后者不用得到前者执行完毕才启动。更有趣的是,只要后者获取了足够的数据,前者便会停止执行。

    grep 'colin' bigfile.txt | head

    故而当 grep 在给定文件中找到含有给定字符串的 10行文字后,即可功成身退,因为那是 head 的全部所需。加入没有管道机制,那就只能这样:

    grep 'colin' bigfile.txt > tmpfile; head tmpfile

    pipes

    管道

    管道(pipe)是所有Unix都愿意提供的一种进程间通信机制。管道是进程之间的一个单项数据流:一个进程写入管道的所有数据都由内核定向到另一个进程,另一个进程由此就可以从管道中读取数据。

    管道被看作是打开的文件,但在已安装的文件系统中没有相应的映像。可以使用pipe()系统调用来创建一个新管道,这个系统调用会返回一对文件描述符; 然后进程通过fork()把这两个描述符传递给它的子进程,由此与子进程共享管道。进程可以在read()系统调用中使用第一个文件描述符从管道中读取数据,同样也可以在write()系统调用中使用第二个文件描述符相管道中写入数据。

    eg:
    pipeline

    示例

    ctipc.h 后面系列都使用此头文件,所以这里include了一些多余的

    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <semaphore.h>
    #include <sys/mman.h>
    /* #include <mqueue.h> */
    #include <sys/fcntl.h>
    /* mqueueh.h is for POSIX messaging queues, and is not available on OS X.  O_NONBLOCK has nothing to do with that, and is defined in fcntl.h */
    #include <string.h>
    #include <errno.h>
    #include <pthread.h>
    #include <signal.h>
    #define FILE_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
    #define MAXLINE 1024

    pipe.cpp

    #define READFD 0
    #define WRITEFD 1
    #include "ctipc.h"
    int main(int argc, char ** argv){
            int pipe_fd[2], n, ret;
            if(pipe(pipe_fd) < 0){
                    printf("create pipe error\n");
                    return 0;
            }
            if((ret = fork()) < 0){
                    printf("fork error \n");
                    return 0;
            }
            if( ret > 0){  //parent process
                    char buff[10240] = {0};
                    close(pipe_fd[WRITEFD]);
                    while(read(pipe_fd[READFD], buff, sizeof(buff))){
                            printf("<print from parent: %s> \n", buff);
                    }
                    printf("<print from parent: read end>\n");
                    close(pipe_fd[READFD]);
                    return 0;
            }
            else{ //child process
                    close(pipe_fd[READFD]);
                    char *info = "[printed in child process, hello world]";
                    write(pipe_fd[WRITEFD], info, strlen(info));
                    return 0;
            }
            return 0;
    }

    输出

    shell> g++ pipe.cpp -o pipe.out
    pipe.cpp:26:30: warning: conversion from string literal to 'char *' is deprecated
          [-Wc++11-compat-deprecated-writable-strings]
                    char *info = "[printed in child process, hello world]";
                                 ^
    1 warning generated.
    shell>./pipe.out 
    <print from parent: [printed in child process, hello world]> 
    <print from parent: read end>

    参考

    展开全文
  • 管道pipe

    2010-09-08 15:58:00
    管道:当从一个进程连接数据流到另一个进程时,使用术语管道pipe)。 <br />#i nclude <unistd.h><br /> int pipe(int filedes[2]); //创建管道 <br />pipe()说明: 返回值:0成功,-1...

    管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe)。

    #i nclude <unistd.h>
    int pipe(int filedes[2]); //创建管道

    pipe()说明:
    返回值:0成功,-1出错。
    如果调用成功,则进程此时由了两个额外的打开文件描述符,filedes[0]中的值是管道的读取端,而filedes[1]是管道的写入端。

    #include<unistd.h>
    #include<sys/types.h>
    #include<errno.h>
    #include<stdio.h>
    #include<stdlib.h>

    int main(){
        int pipe_fd[2];
        pid_t pid;
        char buf_r[100];
        char *p_wbuf;
        int r_num;

        memset(buf_r,0,sizeof(buf_r));

        //创建管道
        if(pipe(pipe_fd)<0){
            printf("pipe create error/n");
            return -1;
        }

        if((pid=fork())==0){//表示在子进程中
            printf("/n");
            //关闭管道写描述符,进行管道读操作
            close(pipe_fd[1]);
            sleep(2);
            //管道描述符中读取
            if((r_num=read(pipe_fd[0],buf_r,100))>0){
                printf("%d numbers read from the pipe is %s/n",r_num,buf_r);
            }
            close(pipe_fd[0]);
            exit(0);
        }
        else if(pid>0){
    //表示在父进程中,父进程写
        //关闭管道读描 述符,进行管道写操作
            close(pipe_fd[0]);
            if(write(pipe_fd[1],"Hello",5)!=-1)
                printf("parent write1 success!/n");
            if(write(pipe_fd[1],"Pipe",5)!=1)
                printf("parent write2 success!/n");
            close(pipe_fd[1]);
            sleep(3);
            waitpid(pid,NULL,0);
            exit(0);
        }
    }
       
    管道读写注意事项:
    1.必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符;
    2.当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。

    展开全文
  • 管道 pipe

    2010-09-12 21:29:00
    管道:当从一个进程连接数据流到另一个进程时,使用术语管道pipe)。 <br />#i nclude <unistd.h><br />int pipe(int filedes[2]); //创建管道 <br />pipe()说明: 返回值:0成功,-1出错。...

    管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe)。

    #i nclude <unistd.h>
    int pipe(int filedes[2]); //创建管道

    pipe()说明:
    返回值:0成功,-1出错。
    如果调用成功,则进程此时由了两个额外的打开文件描述符,filedes[0]中的值是管道的读取端,而filedes[1]是管道的写入端。

    #include<unistd.h>
    #include<sys/types.h>
    #include<errno.h>
    #include<stdio.h>
    #include<stdlib.h>

    int main(){
        int pipe_fd[2];
        pid_t pid;
        char buf_r[100];
        char *p_wbuf;
        int r_num;

        memset(buf_r,0,sizeof(buf_r));

        //创建管道
        if(pipe(pipe_fd)<0){
            printf("pipe create error/n");
            return -1;
        }

        if((pid=fork())==0){//表示在子进程中
            printf("/n");
            //关闭管道写描述符,进行管道读操作
            close(pipe_fd[1]);
            sleep(2);
            //管道描述符中读取
            if((r_num=read(pipe_fd[0],buf_r,100))>0){
                printf("%d numbers read from the pipe is %s/n",r_num,buf_r);
            }
            close(pipe_fd[0]);
            exit(0);
        }
        else if(pid>0){
    //表示在父进程中,父进程写
        //关闭管道读描述符,进行管道写操作
            close(pipe_fd[0]);
            if(write(pipe_fd[1],"Hello",5)!=-1)
                printf("parent write1 success!/n");
            if(write(pipe_fd[1],"Pipe",5)!=1)
                printf("parent write2 success!/n");
            close(pipe_fd[1]);
            sleep(3);
            waitpid(pid,NULL,0);
            exit(0);
        }
    }
       
    管道读写注意事项:
    1.必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符;
    2.当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。

    展开全文
  • 本文实例讲述了Angular2管道Pipe及自定义管道格式数据用法。分享给大家供大家参考,具体如下: 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联。 纯管道(Pure Pipe)与非纯管道(Impure Pipe) 管道...
  • 在#Linux#进程间通信# 管道(pipe)-普通管道pipe中,我们很容易可以看出普通管道一是单工,即只能单向传输,而标准流管道针对匿名管道PIPE一系列封装。返回文件流。只不过返回的文件流无法使用游标/偏移量(offset)...

    #Linux#进程间通信# 管道(pipe)-普通管道pipe中,我们很容易可以看出普通管道一是单工,即只能单向传输,而标准流管道针对匿名管道PIPE一系列封装。返回文件流。只不过返回的文件流无法使用游标/偏移量(offset)相关函数,如lseek等

    标准流管道带有缓冲区,函数如下:

    FILE* popen(char* command ,char* type);

    command:指向的是一个以 null 结束符结尾的字符串,这个字符串包含一个 shell 命令,并被送到/bin/sh 以-c 参数执行,即由 shell 来执行;

    type:表示的是读写方式,只能是其中一种方式,不能读写同时进行。

    • ”r”: 文件指针连接到 command 的标准输出
    • “w” :文件指针连接到 command 的标准输入
    int pclose(FILE* stream);

    stream:要关闭的文件流。

     

    popen函数其实是对管道操作的一些包装,所完成的工作有以下几步:

    1. 创建一个管道。
    2. fork 一个子进程。
    3. 在父子进程中关闭不需要的文件描述符。
    4. 执行 exec 函数族调用。
    5. 执行函数中所指定的命令。

     

    具体用法如下:在shell中运行命令dmesg | grep "WARNING:" | wc -l, 并且将结果内容读取到当前进程的文件流f中。

    int get_warnings_count(void)
    {
    	int warnings;
    	FILE *f;
    
    	f = popen("dmesg | grep \"WARNING:\" | wc -l", "r");
    	fscanf(f, "%d", &warnings);
    	fclose(f);
    
    	return warnings;
    }
    

    因此,可见标准流管道一般用于与shell相关命令有关的一些操作...

     

    展开全文
  • vc 显示当前管道pipe的使用情况,有哪些管道.zip
  • 管道pipe理解

    2019-11-06 10:33:45
    管道pipe理解管道特点管道容量的大小功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants...
  • 管道Pipe可以将数据作为输入,然后按照规则将其转换并输出。在Angular2中有许多内置的Pipe,比如DatePipe、UpperCasePipe和CurrencyPipe等。在这里我们主要介绍如何自定义Pipe。 1. 管道定义 Pipe的定义如下代码所示...
  • FIFO配合管道PIPE,实现FIFO传递数据,PIPE触发epoll,异步IO效果
  • Linux下的无名管道pipe的设计.docx
  • linux内核管道pipe实现详解

    千次阅读 2017-08-12 14:45:42
    linux内核管道pipe实现详解
  • 实验七 管道pipe和popen通信 实验目的 1. 掌握无名管道pipe的原理 2. 掌握管道的应用及重定向 3. 熟悉popen创建管道的方式及应用程序设计 实验内容 1. (1) 在命令行下执行ls l |grep .c命令查看运行结果 2设计一个...
  • 匿名管道 pipe

    2015-06-23 07:38:59
    匿名管道实现的完整代码。 管道 分为 匿名管道 和 命名管道 匿名管道,只适合有亲缘关系的进程之间使用
  • 管道PIPE_BUF说明

    千次阅读 2018-06-17 00:10:42
    管道PIPE_BUF说明 FIFO被称为命名管道。PIPE也是管道。由于pipe和FIFO本质上都是管道,不同点就是创建方式不一样、FIFO多个进程使用(可以没有共同祖先)、FIFO多个进程通信。因此,FIFO的测试demo就不多介绍了。本...
  • Angular 2的管道Pipe

    千次阅读 2017-03-26 15:40:39
    Angular2 管道 Pipe
  • 两个线程之间单向传递数据时,可以使用管道Pipe规范读写操作 public static void testPipe() throws IOException { //创建管道 Pipe pipe = Pipe.open(); ByteBuffer buf = ByteBuffer.allocate(1024); ...
  • linux管道pipe详解

    万次阅读 多人点赞 2018-08-24 17:58:04
    调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用,一个表示读端,一个表示写端。 3. 规定数据从管道的写端流入管道,从读端流出。 管道的原理:...
  • 管道Pipe的初次使用

    千次阅读 2017-02-16 19:13:20
    管道Pipe提供一种让多个进程间通信的方法,当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数...
  • 使用管道Pipe 完成数据传输

    千次阅读 2017-10-20 14:02:10
    public void test() throws IOException{ ... Pipe pipe = Pipe.open(); //2.将缓冲区的数据写入管道 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); Pipe.SinkChannel channel1 = pipe.sink();
  • Linux 管道pipe

    2017-03-08 23:26:47
    管道是一种最基本的IPC机制,由pipe函数创建: #include 
 int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户 程序两个文件...
  • 管道pipe的两种用法

    2018-12-18 23:50:47
    管道pipe是unix较早的一批用于进程间通信的机制。   #include&lt;unistd.h&gt; int pipe(int fd[2]);   用法如下 #include&lt;unistd.h&gt; #define MAXLINE 4096 int main(int argc, ...
  • 无名管道pipe使用方法

    2017-06-12 20:10:41
    有名管道pipe函数:int pipe(int filedes[2]);  下面程序通过创建进程,父进程写入数据,子进程读取数据,从管道中读取数据。 #include #include #include #include #include int main() { int fd[2] = {0}...
  • Linux 高级编程 - 无名管道 Pipe

    千次阅读 2017-09-03 09:26:25
    Linux 高级编程 - 无名管道 Pipe
  • 我们通常把一个进程连接到另一个进程的一个数据流称为一个“管道”,通常是用作把一个进程的输出通过管道连接到另一个进程的输入。管道本质上是内核的一块缓存。内核使用环形队列机制,借助内核缓冲区(4k)实现。 ...
  • usb设计中的管道pipe描述

    千次阅读 2017-10-05 14:30:15
    usb设计中的管道pipe描述 在USB设计中,常有描述管道的说明,对应的图示为: 在实际设计中:pipe为一个int数 定义如下: 以32位系统为例,int为32 bit.bit:31-30:为管道传输的流类型 00: isochronous flow 01: ...
  • VS2008工程 里面有4个工程,命名管道和匿名管道的父子进程。
  • Angular深入理解管道Pipe

    万次阅读 2018-02-25 22:14:16
    Angular深入理解管道管道与非纯管道区别的本质 Pure Function Impure Function 内置Pipe ...有学过linux shell的同学,应该知道管道,在shell中的管道是IPC,linux的进程间通讯有pipe,FIFO,signal...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,977
精华内容 30,390
关键字:

管道pipe