千家信息网

Shell的管道与重定向怎么创建

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Shell的管道与重定向怎么创建",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Shell的管道与重定向怎么创建"吧!对shell有一定了
千家信息网最后更新 2026年11月01日Shell的管道与重定向怎么创建

本篇内容主要讲解"Shell的管道与重定向怎么创建",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Shell的管道与重定向怎么创建"吧!

对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制。

在shell中,我们通常使用符合‘|’来表示管道,符号‘>’和‘<’表示重定向。

那么管道和重定向的真实含义(定义)又是什么呢?

管道

管道的定义

管道就是一个进程与另一个进程之间通信的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入。

它是半双工运作的,想要同时双向传输需要使用两个管道。

管道又可以分为匿名管道和命名管道,而shell中使用到的是匿名管道,所以本文仅描述匿名管道。

例如命令ls | grep main.c,使用了管道来连接了两条命令来执行,能够快速地让我们知道当前目录下是否有 main.c 文件。

管道的本质是内存中的缓冲区,可以看作是打开到内存中的文件。

所以需要使用两个文件描述符来索引它,一个表示读端,一个表示写端。

并且规定,数据只能从读端读取、只能往写端写入。

创建管道

使用函数pipe()可以创建匿名管道,需要包含头文件 unistd.h,示例代码:

int fd[2];  pipe(fd);

首先创建一个 2 个元素的整型数组,然后将该数组作为pipe()的参数,pipe()执行成功后,数组元素 fd[0]的值就会变成所创建的管道的读端的文件描述符,fd[1]就会变成写端的文件描述符。

至此管道就算创建成功了。

把管道作为标准输入输出

管道创建成功后,就可以直接使用 read()和 write()函数对管道进行数据的读写。

而因为shell中都是使用标准输入输出对管道进行读写的,例如ls | grep main.c就是将 ls 的标准输出写到了管道写端,而 grep 的标准输入则从管道读端读取,所以本文也只描述此方法。

示例代码如下:

int fd[2];  pipe(fd);  pid=fork();  if(0==pid) //execute next command in child process  {   dup2(fd[0],0);//redirect standard input to pipe(read)   close(fd[0]);   close(fd[1]);   if(0!=execvp(cmd0[0],cmd0))    printf("No such command!\n");   exit(EXIT_SUCCESS);  }  else //execute current command in current process   {   dup2(fd[1],1);//redirect standard output to pipe(write)   close(fd[0]);   close(fd[1]);   if(0!=execvp(cmd1[0],cmd1))    printf("No such command!\n");   exit(EXIT_SUCCESS);  }
  • 首先是创建一个管道,然后创建子进程,子进程会继承这一个管道,也就保证了父进程与子进程操作的是同一个管道(管道的继承与普通变量不同)。

  • 如果我们希望在子进程中执行管道的读端的程序例如ls | grep main.c中的grep main.c;在父进程中执行管道的写端的程序,例如ls | grep main.c中的ls。

  • 在子进程中,先调用dup2(fd[0],0);此函数就是将标准输入的文件描述符 0,指向了管道的读端。

文件描述符,本质是非负整数,通常是小整数;它是一个索引,通过该索引可以找到对应的文件。

例如,标准输入、标准输出、标准错误的文件描述符默认是 0、1、2 。当进程需要从标准输入中读取数据时,就会通过 0 索引找到标准输入所对应的内存缓冲区来读取数据。

  • 假设此时管道读端的文件描述符为 3、写端文件描述符为 4 。

  • 调用dup2(fd[0],0),实际上就是将文件描述符 3 指向的文件表项赋值给了文件描述符 0,而文件描述符 0 正是进程默认的标准输入。

  • 所以此时,当进程需要从标准输入读取数据时,进程就会通过文件描述符 0 来找到管道读端所对应内存缓冲区。

  • 从而实现了通过标准输入来读取管道的数据,也可以说是,将管道的读端重定向到了标准输入。管道的写端与标准输入的关系也与此类似,此处不再赘述。

  • 调用dup2(fd[0],0)之后还需要调用close()函数将管道原有的文件描述符关闭,关闭的意思是文件描述符 3 和 4 不再索引到管道或者其他文件,也就是说此时使用 read 函数从文件描述符 3 中是读取不到管道的数据的了,并不是说关闭管道的意思。

  • 完成管道的设置之后,就可以通过 exec 族函数来执行外部命令了。

需要注意的是,调用 exec 族函数并不会把管道这种 IPC 资源覆盖或者重新初始化。文件重定向

文件重定向

其实与上面管道重定向到标准输入输出很类似,甚至可以直接采用上面所说的方法来实现。但是此处将讲述一种更加简洁的方法实现。

实例代码如下:

char fileName[20]="out.txt";  freopen(fileName,"w",stdout);//redirect stdout to fileName

以上两行简单的代码就实现了,将该进程的标准输出重定向到了文件 out.txt ,甚至一行就可以实现。

执行以上代码后,当前进程的所有标准输出,也就是 printf()之类的输出全都会被写到文件 out.txt,显示屏将不会有输出。

而将进程的标准输入重定向到文件 in.txt 的代码如下:

char fileName[20]="in.txt";  freopen(fileName,"r",stdin);//redirect stdin to fileName

其中的核心函数就是freopen():

到此,相信大家对"Shell的管道与重定向怎么创建"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

管道 文件 标准 进程 输入 输出 函数 数据 代码 就是 端的 索引 内存 成功 命令 数组 方法 缓冲区 缓冲 实用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 西安纸贵互联网科技有限公司 云信互联网科技有限公司 美国互联网科技巨头监管 为想互联网科技 互联网科技革命 智慧科技互联网 互联网 科技服务平台 重庆科技学院互联网 滨湖区互联网智能科技产品供应 山东吉时兔互联网科技有限公司 互联网公司会议桌创意科技软装饰 字节跳动和互联网科技 天津腾达互联网科技有限公司 深圳市罗太互联网科技有限公司 晋城互联网科技 为客找房互联网科技公司怎么样 广州富喜互联网络科技 互联网科技企业商标注意事项 北京天晋互联网科技有限公司 互联网科技对化妆品行业 华服互联网科技靠谱吗 极限挑战互联网科技 济南和联互联网科技有限公司 创业天下互联网科技有限公司 互联网5g黑科技有哪些 移动互联网年度科技创新 互联网科技大奖都有哪些公司 用友工业互联网科技发展 互联网安防科技感 宁波跨境商互联网科技有限公司
0