管道 PIPE

简介: 没错,就讲大家可能天天会用的“管道 | “,前者的输出是后者的输入。这里简单要提一点大家可能忽略了的一个有趣事实是,后者不用得到前者执行完毕才启动。更有趣的是,只要后者获取了足够的数据,前者便会停止执行。grep 'colin' bigfile.txt | head故而当 grep 在给定文件中找到含有给定字符串的 10行文字后,即可功成身退,因为那是 hea

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

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>

参考

目录
相关文章
|
机器学习/深度学习
【机器学习】误差分析
【1月更文挑战第23天】【机器学习】误差分析
|
数据挖掘 数据安全/隐私保护 开发者
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
1372 0
|
小程序 安全 API
支付宝消息订阅
订阅界面是根据当前小程序在商家平台配置的消息模板 id 来展示对应消息的订阅选项(参考接入流程第 4 步)。一次性:使用一次性消息模板订阅,每次向用户发送消息都需要用户在订阅界面点击同意后才可以发送。长期性:使用长期性消息模板订阅,用户同意订阅后,可以多次向订阅用户发送消息。
796 0
 支付宝消息订阅
|
Shell Linux
uboot启动流程源码分析(二)
uboot启动流程源码分析(二)
272 0
|
网络协议
伪头部校验
伪头部校验
686 6
|
Linux 项目管理 开发者
管理工具 Pip
【4月更文挑战第8天】本文详尽介绍了Python包管理工具Pip的使用,包括安装、升级Pip,安装与卸载包,管理依赖关系,查看包信息,使用虚拟环境,自定义配置,源码安装,包的升级与降级,以及Pip的高级功能和生态系统扩展。此外,还提到了Pip的安全性、日志、调试、自动化集成和最佳实践,旨在帮助开发者更有效地管理Python项目。学习本文,读者将全面掌握Pip命令,提升项目管理效率。
|
SQL Oracle 关系型数据库
DBeaver,一款好用的开源数据库管理软件
DBeaver,一款好用的开源数据库管理软件
485 3
|
人工智能 自然语言处理 数据挖掘
利用AI集成工具提升工作效率的实践经验
随着人工智能技术的蓬勃发展,以及当今数字化快速发展的时代,人工智能的运用已经渗透到各个行业和工作领域中,大语言模型在自然语言处理领域的应用也愈发广泛,而且市面上涌现出一批AI集成工具,比如Langchain、Dify、llamaIndex、fastgpt、百炼等,它们为开发者提供了强大的支持和便利,极大地提升了AI模型的构建和管理效率。作为一名热衷于利用新技术提高工作效率的开发者,我也积极尝试将这些工具融入到我的日常工作中,以期望提升工作效率和质量,下面我将分享我是如何使用AI集成工具来提升工作效率的,以及实践经验和心得。
812 1
利用AI集成工具提升工作效率的实践经验
|
人工智能 安全 算法
5G 网络中的加密:守护你的数据安全
5G 网络中的加密:守护你的数据安全
1066 0