Linux下管道(匿名管道|命名管道)以及管道命令的汇编自结

时间:2021-04-11 15:43:06

一、linux中管道概念

1.管道
Linux系统中,进程间通信手段有很多,例如信号量、队列、套接字以及管道等等。管道是进程间通信的一种手段。管道包括匿名管道和命名管道。

2.命名管道
命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在。通过ls命令,管道文件的文件类型是p. 由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便。
在Linux中关于命名管道的操作有两种方式,如下:
(1)使用linux命令
mknod fifo_name p    #创建名称为filename的管道文件
mkfifo fifo_name      #创建名称为filename的管道文件,推荐使用mkfifo命令来创建命名管道
echo "test text" > fifo_name   #向FIFO中写数据
cat < fifo_name 或 cat fifo_name  #用cat命令读取FIFO文件,这个时候,cat命令将一直挂起,直到终端或者有数据发送到FIFO中
备注:linux中的命名管道文件,可以像操作普通文件一样操作即可。
(2)使用linux系统函数
int mkfifo(const char *fifo_name, mode_t mode);   #创建fifo_name的管道文件
int mknod(const char *fifo_name, mode_t mode | S_FIFO, (dev_t)0);   #创建fifo_name的管道文件
pipe_fd = open(fifo_name, open_mode);   #打开管道文件fifo_name
write(pipe_fd, buffer, bytes_read);     #向管道文件的文件描述符pipe_fd的写入数据
read(data_fd, buffer, PIPE_BUF);       #从管道文件的文件描述符中读取数据

3.匿名管道
所谓匿名管道,是相对于命名管道而言的,就是不会显式地创建出管道文件。
在Linux中关于匿名管道的的操作有两种方式,如下:
(1)使用linux命令
在linux bash中使用管道命令,其实就是一种匿名管道的使用方式
(2)使用Linux系统函数
类似命名管道,使用linux系统函数来操作管道,但是不会显式地创建管道文件。 

二、Linux中管道命令

1.管道命令的含义:

管道命令应用形式——command1 | command2

command1将其stdout作为command2的stdin,那command就是一个管道命令。

常见的管道命令有:more,less,head,tail,cut,grep,sort,wc,uniq等等

Remarks:

           a)管道命令command2只会处理command1的stdout,而command2的stderr会被予以忽略

           b)能够接受stdin的数据的命令才能成为管道命令

 

2.常见的管道的命令的用法

            a)grep

                      形式:grep [-option] '查找字符串' filename

                      作用:grep以行为单位去分析,如果某行中含有指定的查找字符串,那么就将这行信息显示出来

                      grep中的几个重要option:

                           (1)-v 表示反转匹配,就是将没有match的行显示出来,也就是将没有查找字符串的行显示出来

            b)cut

                      形式1:cut -d ‘分割字符' -f n

                      作用:以行为单位分析,以指定的分割字符分割每行,然后取出第n列

                      形式2:cut -c 字符范围

                      作用:取出每行中指定字符范围的所有字符


3.减号-在管道命令中应用

在管道命令中,会使用前一个命令的stdout作为本命令的stdin,如果管道符号前后命令传递的是文件时,可以使用减号-代替。举例如下:

tar -cvf - /home | tar -xvf -  #减号-代表的是打包文件
wget remotehost:/home/wahaha/testscript.sh -O - | sh -   #减号-代表的是远程主机上的脚本文件

学习资料参考于:

http://blog.csdn.net/xiajun07061225/article/details/8471777