linux什么是管道 在linux中管道分为2种类型
大家好,今天来为大家解答linux什么是管道这个问题的一些问题点,包括在linux中管道分为2种类型也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
Linux 系统中“|”管道的作用是什么
“|”是管道命令操作符,简称管道符。利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output的信息,对于 standard error信息没有直接处理能力。
用法示例:
ls-l| more
该命令列出当前目录中的文档,并把输出送给more命令作为输入,more命令分页显示文件列表。
linux里面什么是管道符
题主你好,
首先,linux下的管道符使用"竖杠"表示:
|
它的作用是:
连接两个命令,将第一个命令的输出作为第二个命令的输入.
形象一点的比喻:
管道符好比流水线上的传送带,比如,一个流水线是由两步组成的,先由第一道工序将黄桃洗净,然后通过传送带将洗净的黄桃送到第二道工序装罐,用管道的思维去处理这个过程就是:
清洗黄桃|装罐
需要注意的是,其实每个过程都是由"动作+被作用对象"组成,也就是说,上面的例子其实是:
清洗黄桃
装罐洗净的黄桃
这两步组成的,但由于管道符的使用,除了第一道工序需要"被作用对象"外,后面的工序使用的是管道符传过来的"前一道工序处理过的对象".
举例来说,使用ls和grep这两个命令实现只输出文件的详细信息,不输出目录的详细信息.正常情况下这俩半个命令的用法是:
ls选项路径
grep模式文件流
而使用管道连在一起的写法:
ls-l/root/ok/tmp|grep'^-'
*.在使用管道符的组合命令中,只有第一个命令需要"被作用对象"
希望对题主有帮助,欢迎追问
unix管道的意思是什么
管道是UNIX系统最古老的IPC形式。
它有以下两点局限性:数据只能单向流动只能在具有公共祖先的两个进程间使用。通常是父进程通过系统调用pipe()创建管道,然后fork()出子进程,这两个进程就可以通过管道进行通信了。术语定义管道fd:一条管道有两个文件描述符,这两个文件描述符是在调用pipe(fd)创建管道时获取获取的。fd[0]:通过该文件描述符可以从管道中读取数据fd:通过该文件描述符可以向管道写入数据写端进程:只向管道写数据的进程。在使用管道时,先close(fd[0])、再通过write(fd)向管道写数据。读端进程:只从管道读数据的进程。在使用管道时,先close(fd)、在通过read(fd[0])从管道读取数据。代码示例下列代码在linux环境下,粘贴到本地后可以直接编译运行。#include<unistd.h>//declare int pipe(int pipefd);#include<limits.h>//PIPE_BUF#include<stdio.h>#include<sys/wait.h>#include<string.h>#define MSG_FROM_PARENT"Hello, world!"int fd={0};//存储管道的两个文件描述符,fd[0] for read, fd for writeint main(int argc, char**argv){int pid= 0;//#define PIPE_BUF4096 printf("PIPE_BUF:[%d]\", PIPE_BUF);if(0!= pipe(fd)){ perror("pipe"); return-1;}pid= fork();if(pid< 0)// fork error{ perror("fork"); return-1;}else if(pid> 0)// branch of parent{ close(fd[0]);// parent close read if(write(fd, MSG_FROM_PARENT, sizeof(MSG_FROM_PARENT))< 0){ perror("write"); close(fd); return-1;} close(fd);//建议注释掉这行代码,运行查看下效果。有惊喜哟。你会发现printf()中\有将缓冲区刷新的效果 if(waitpid(pid, NULL, 0)< 0){ perror("waitpid"); return-1;} printf("parent exit\");}else// branch of son{ close(fd); char read_buf={0};//故意把buf设的小一点,这样可以多次读取管道,观察更多细节 int readlen= 0; do{ memset(read_buf, 0, sizeof(read_buf)); perror("before read"); readlen= read(fd[0], read_buf, sizeof(read_buf)- 1); if(readlen< 0){perror("read");close(fd[0]);return-1;} perror("after read"); printf("%s", read_buf);// printf()的fmt如果加上'\',其效果可不只是换行哟。//'\'其实还有fflush(stdout)的作用:将printf缓冲区的数据刷新到stdout(即屏幕)上。}while(readlen> 0); close(fd[0]); printf("\son exit\");}return 0;}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182831234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283重点总结如果pipe的一端被关闭,以下两条规则将生效:如果写端关闭,那么读端将管道中的数据全部读完后,如果再次调用read,将会返回0。换言之,如果写端进程写完数据后没有关闭pipe的写端文件描述符,那么读端进程在读取一个不再有数据可读的管道时会阻塞。如果读端关闭,那么写端write时,将会产生信号SIGPIPE,如果该信号未被处理,write将返回-1,且errno被置为EPIPE。关于linux信号处理,有时间单写一篇博客总结一下。这里只需要注意,向一个读端关闭的管道写数据,write会返回-1;如果读端没有关闭,但是管道的数据一直没有被读端进程读走,那么当管道中缓存数据达到PIPE_BUF规定的上限时(本示例中打印出的上限是4096 bytes),write会阻塞!以上两条规则告诉我们,不管是读端进程还是写端进程,用完了管道都要记得关闭啊!否则对端进程再次读写管道时会阻塞的!好严重的!