Linux管道命令(pipe)

Linux管道命令(pipe),第1张

管道命令就是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的 *** 作对象。

管道命令的 *** 作符是:|,它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为 *** 作对象。

基本格式:

指令1 | 指令2 | …

【指令1】正确输出,作为【指令2】的输入,然后【指令2】的输出作为【指令3】的输入,如果【指令3】有输出,那么输出就会直接显示在屏幕上面了。通过管道之后【指令1】和【指令2】的正确输出是不显示在屏幕上面的。

【提醒注意】

管道命令只能处理前一条指令的正确输出,不能处理错误输出

管道命令的后一条指令,必须能够接收标准输入流命令才能执行。

使用示例

1、分页显示/etc目录中内容的详细信息

$ ls -l /etc | more

2、将一个字符串输入到一个文件中

$ echo “hello world” | cat >hello.txt

Linux 实现 IPC 其中的一种方式——管道

管道又分:

1、无名管道:无名管道只能用于有亲缘关系的进程

2、有名管道:有名管道用于任意两进程间通信。

你就可以把管道理解成位于进程内核空间的“文件”。

给文件加引号,是因为它和文件确实很像,因为它也有描述符。但是它确实又不是普通的本地文件,而是一种抽象的存在。

当进程使用 pipe 函数,就可以打开位于内核中的这个特殊“文件”。同时 pipe 函数会返回两个描述符,一个用于读,一个用于写。如果你使用 fstat函数来测试该描述符,可以发现此文件类型为 FIFO。

而无名管道的无名,指的就是这个虚幻的“文件”,它没有名字。本质上,pipe 函数会在进程内核空间申请一块内存(比如一个内存页,一般是 4KB),然后把这块内存当成一个先进先出(FIFO)的循环队列来存取数据,这一切都由 *** 作系统帮助我们实现了。

pipe 函数打开的文件描述符是通过参数(数组)传递出来的,而返回值表示打开成功(0)或失败(-1)。

它的参数是一个大小为 2 的数组。此数组的第 0 个元素用来接收以读的方式打开的描述符,而第 1 个元素用来接收以写的方式打开的描述符。也就是说,pipefd[0] 是用于读的,而 pipefd[1] 是用于写的。

打开了文件描述符后,就可以使用 read(pipefd[0]) 和 write(pipefd[1]) 来读写数据了。

注意事项

1、这两个分别用于读写的描述符必须同时打开才行,否则会出问题。

2、如果关闭读 (close(pipefd[0])) 端保留写端,继续向写端 (pipefd[1]) 端写数据(write 函数)的进程会收到 SIGPIPE 信号。

3、如果关闭写 (close(pipefd[1])) 端保留读端,继续向读端 (pipefd[0]) 端读数据(read 函数),read 函数会返回 0。

当在进程用 pipe 函数打开两个描述符后,我们可以 fork 出一个子进程。这样,子进程也会继承这两个描述符,而且这两个文件描述符的引用计数会变成 2。

如果你需要父进程向子进程发送数据,那么得把父进程的 pipefd[0] (读端)关闭,而在子进程中把 pipefd[1] 写端关闭,反之亦然。为什么要这样做?实际上是避免出错。传统上 pipe 管道只能用于半双工通信(即一端只能发,不能收;而另一端只能收不能发),为了安全起见,各个进程需要把不用的那一端关闭(本质上是引用计数减 1)。

步骤一:fork 子进程

步骤二:关闭父进程读端,关闭子进程写端

父进程 fork 出一个子进程,通过无名管道向子进程发送字符,子进程收到数据后将字符串中的小写字符转换成大写并输出。

有名管道打破了无名管道的限制,进化出了一个实实在在的 FIFO 类型的文件。这意味着即使没有亲缘关系的进程也可以互相通信了。所以,只要不同的进程打开 FIFO 文件,往此文件读写数据,就可以达到通信的目的。

1、文件属性前面标注的文件类型是 p

2、代表管道文件大小是 0

3、fifo 文件需要有读写两端,否则在打开 fifo 文件时会阻塞

通过命令 mkfifo 创建

通过函数 mkfifo创建

函数返回 0 表示成功,-1 失败。

例如:

cat 命令打印 test文件内容

接下来你的 cat 命令被阻塞住。

开启另一个终端,执行:

然后你会看到被阻塞的 cat 又继续执行完毕,在屏幕打印 “hello world”。如果你反过来执行上面两个命令,会发现先执行的那个总是被阻塞。

有两个程序,分别是发送端 send 和接收端面 recv。程序 send 从标准输入接收字符,并发送到程序 recv,同时 recv 将接收到的字符打印到屏幕。

发送端

接收端

编译

运行

因为 recv 端还没打开test文件,这时候 send 是阻塞状态的。

再开启另一个终端:

这时候 send 端和 recv 端都在终端显示has opend fifo

此时在 send 端输入数据,recv 打印。

Linux 是一套 Unix-like 的 *** 作系统,是 Unix 的一种,它控制整个系统基本服务的核心程序 (kernel) 是由 Linus 带头开发出来的,「Linux」这个名称便是以「Linus's unix」来命名,Linus 选择用「大众公有版权」 (GPL)的方式来发行这份程序,这个版权允许任何人以任何形式复制与散布 Linux 的原始程序,换句话说,Linux 实际上是「免费的」,使用者在网络上就可以抓到 Linux 的原始程序代码,随心所欲的复制与更改 Linux 的原始程序,在因特网的日渐盛行以及 Linux 开放自由的版权之下,吸引了无数计算机高手投入开发、改善 Linux 的核心程序,使得 Linux 的功能日见强大,所以今日我们可以在网络上免费下载 Linux 使用,或者花很少的一点费用就可以取得 Linux 光盘,这都是因为 Linux 是 GPL 版权的缘故。

除了核心程序以外,一个 *** 作系统还需要其它的系统程序跟应用程序才有实用性,Linux 系统中常用的系统程序大部份是美国自由软件基金会 (Free Software Foundation) 开发出来的软件,而且也有不少机构或个人为 Linux 开发应用程序,这些程序一样大多都是自由软件,任何人都可以免费的在网络上取得,不过自行去取得这些程序再一一安装非常不便,于是有些公司或团体就会去搜集、整合 Linux 上的程序,把「核心-系统程序-应用程序」总合起来构成一个完整的 *** 作系统,让一般使用者可以简便的安装完整个系统,这就是所谓的「安装软件包」(distribution),我们一般讲的 Linux 系统便是针对这些安装软件包而言,同样是 Linux 系统,却分成不同公司、机构整合出来的不同安装软件包,这就是大家常常在网络上看到 Linux 有那么多「种」的原因。

Linux 具有 Unix 系统的程序接口跟 *** 作方式,也继承了 Unix 稳定有效率的特点。网络上安装 Linux 的主机连续运做一年以上而不曾当机、不必关机是稀松平常的事,不过 Linux 却不象一般 Unix 要负担庞大的版权费用,也不需要在专属的昂贵硬件上才可以使用;Linux 可以在一般的 i386 PC 上执行,效能又高,自然而然的接收了过去几十年来在 Unix 上累积的程序资源跟使用者,加上 GPL 的版权允许大家自由散布 Linux 的原始码,并针对自己的需求修改程序,使得 Linux 在目前已经成为非常受人欢迎的一个多人多任务、免费、稳定、效率高、可以在包括 i386、Sparc、Alpha、Mips、PPC 等众多不同计算机系统平台上执行的 *** 作系统。

Linux支持多种硬件装置,诸如x86、Motorola 68k、Digital Alpha、Sparc、Mips、Motorola PowerPC和ARM等等。由于程序代码公开,硬件厂商无须多付额外的版权费用,便得以替自行生产的硬件装置开发适用于Linux的驱动程序,提高产品销售率。

软 体方面,如X,为窗口系统的工业标准;另外,由理察·史托曼主导的Emacs,提供窗口版和文字版的文书编辑环境,功能复杂强大,有一套完整的在线说明档 案;而众人合作开发的SpreadSheet,是窗口版的电子表格,任何熟稔Lotus 1-2-3的人,看到这样丰硕的成果,都会有莫名的感动的。当然,最为人称道的,是Linux的网络能力,不论是SLIP、PPP、NetBEUI、 DDP、X.25还是ISDN等等,Linux都有相应的软件供应;而稳定的服务器功能,适用于架设Intranet和Internet。

一般用户受益于GNU GPL和LGPL的保护,可以不同的管道取得完整的Linux,故而Linux可以是「免费的(gratis)」。相对于Unix昂贵的版权费用,Linux称得上是物美价廉。

除此以外,Linux还具有如下的特色∶

· 具备多人多任务∶这表示Linux可以在同一段时间内服务许多人各别的需求。形象一点讲,你可以一边听铁达尼号的原声CD,一边编辑文书,一边又在打印档案,还可以随时玩X版的俄罗斯方块。

· 支持多CPU∶这绝对不是NT的专利,Linux也支持这种硬件架构,代表着更快速的运算和革命性的算法即将成为时代的主流。

· RAM保护模式∶程序(processes)之间不会互相干扰,保证系统能常久运作无误。根据许多人下载系统评量程序(benchmarks)以测试 Linux的执行效能,结果发现单单是配备486CPU的PC,效能便足堪媲美升阳(Sun)或是迪吉多的中级工作站了。

· 动态加载程序∶当程序加载RAM执行时,Linux仅将磁盘中相关的程序模块加载,有效地提升了执行的速率和RAM的管理。

· 动态连结共享程序馆∶这表示执行档的大小大量地减少,有助于节省磁盘空间。

· 支持多种档案系统∶如Minix、Xenix、System V等等著名的 *** 作系统。将来NT的NTFS也会列入支持的。

· 看得见DOS∶这是所谓的透明化(transparency);把DOS的FAT档案系统视为特殊的远程档案系统,不需任何特别的指令便可以灵活运用,就如同一个在Linux底下存在的目录一样。

Linux的发展

近几年的发展,已使得Linux成为微软、升阳的另一大敌手。Linux挟其价格低廉、品质良好与稳定的竞争优势,正无形无影地扩散至众多以PC为主的工作 平台上。早期因缺乏商业性应用软件,单凭学术味道浓厚的工具程序,是无法打入一般商家的主流 *** 作系统的。然而,今日的Linux已非吴下阿蒙,KDE、 Gimp、Gnome等计划相继地开展,为X提供了更多图形接口的桌面 *** 作环境和应用软件。

约1993年左右,Linux首先以发行软 体(distribution)的型态出现。这是一群完整的软件,包含安装程序、核心、应用软件、X、驱动程序等的软件包,经由Internet下载至磁 盘片进行安装。那时的安装程序简陋,难以成功地安装妥当,接口亲和力不足和硬件支持不良是最大的障碍。

后来出现了光驱,光盘片的传播媒体也应运而生,现今Linux厂商所制作的发行软件也都是以此为主要的发行媒介。国内常见的有Red Hat、Slackware和Debian这三种。其中以Debian算是至今仍维持非商业型态的重量级发行软件了,FSF曾经以基金援助过其初阶段的发展。任何人都可以从Debian的FTP站上下载整套的发行软件。当然,象Red Hat这样的商业组织,Red Hat发行软件一样也可以从FTP站上下载,不过如果花一点小钱买光盘片的话,就可以得到额外的技术支持和有用的说明档案。

要得到这些光盘片,最简单的方法便是买有关Linux的书籍,不论中文版或是英文版的书本,书背面都会附上一片载有该公司或组织所制作的发行软件。一般书内多会有专章讲解安装和设定的过程,读者可善加利用。不同的发行软件有不同的安装机制,然而都是Linux。

对国内用户而言,最关切的莫过于Linux中文技术的发展情况了。X窗口系统已有稳定的中文版问世,各种中文输入法和中文仿真窗口也已进入成熟的阶段,相信未来会朝向应用软件中文化的层面发展,使X的 *** 作环境符合国内用户的需求。

Linux的应用

没有商业活动,就没有Linux;没有信息自由的自觉,更不可能有Linux。

Linux除了是优良的软件开发平台之外,也是工作、家居的好伙伴。有人说∶「有了Linux,就等于有了阿拉神灯。」此言不假矣。又有人说∶「到现在还没有移植到Linux的软件,肯定是一点价值也没有的。」这话也不差呀。

Linux的发展证实了信息会愈来愈便宜的趋势;因为便宜,市场便无限扩张。商业活动也转向为以服务为导向的型态。最直接的案例便是ISP的应用。

Linux可以用来架设ISP!

Linux Journal的发行人SSC(Specialized System Consultants)便是以Linux做为网络拨接服务平台的。要成为ISP业者,需要有连接至因特网的能力,多序列阜拨接服务(如 Cycades、Maxspeed、Gtek等公司所提供的软件系统),PPP和SLIP的服务,Usenet新闻群组(如INN),邮件递送(如 sendmail),网页服务器(如Apache),备份功能(如tar、cpio)等等的应用软件。由此观察,主要的控制成本会落在因特网的通讯租费 上,投资Linux的费用是非常低的。

本文摘录自「 Official CLE 0.8 — 中文 Linux 延伸软件包使用指南

大力发展linux软件事业,有助于我国自主软件的开发,保护国家信息安全,并且在国际竞争中赢得一点份额


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6246880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存