UNIX中C语言的管道

一、管道的概念

管道是一种队列类型的数据结构,它的数据从一端输入,另一端输出。管道最常见的应用是连接两个进程的输入输出,即把一个进程的输出编程另一个进程的输入。shell中存在专门的管道运算符"|",例如shell命令:

ps -ef |grep init

命令"ps -ef"分析当前运行的全部进程,并将结果打印到屏幕上。进程"grep init"从输入的字符串中查找包含字符"init"的子串,并打印结果。这两个领命通过管道符连接起来后就成了一个新的应用:查找正在应用的、命名中包含字符"init"的进程。

二、无名管道

无名管道通畅直接称之为管道,它占用两个文件描述符,不能被非血缘关系的进程共享,一般应用在父子进程中。

1.无名管道的建立

UNIX中一切皆为文件,管道也是文件的一种,成为管道文件。当系统创建一个管道时,它返回两个文件描述符:一个文件以只写打开,作为管道的输入端;另一个文件以只读打开,作为管道的输出端。

在UNIX中,采用函数pipe创建无名管道,其原型为:

#include<unistd.h>

int pipe(int fildes[2]);/*其中fildes[0]为读而开,fildes[1]为写而开,fildes[1]的输出是fildes[0]的输入*/

函数pipe在内核中创建一个管道,并分配两个文件描述符标识管道的两端,这两个文件描述符存储于fildes[0]和fildes[1]中。一般约定fildes[0]为输入端,进程向此文件描述符写入数据,fildes[1]描述管道的输出端,进程向此文件描述符中读取数据。函数pipe调用成功时返回0,否则返回-1。

2.单向管道流模型

管道的两端(输入和输出端)被一个进程控制没有太大的意义,如果管道的两端分别控制在不通的进程中,这两个进程之间就能够进行通信。拥有管道输入端的进程,可以向管道发送信息,拥有管道输出端的进程,可以从管道中接收一个进程发送来的信息。

1)从父进程流向子进程的管道

在父进程创建无名管道并产生子进程后,父子进程均拥有管道两端的访问权。此时关闭父进程的管道输出端、关闭子进程的管道输入端,就形成一个从父进程到子进程的管道流,数据由父进程写入、从子进程读出。创建从父进程流向子进程的管道过程如下:

1st:创建管道,返回无名管道的两个文件描述符fildes[0]和fildes[1]。

int fildes[2];

pipe(fildes);

2nd:创建子进程,子进程继续无名管道文件描述符。

3rd:父进程关闭管道的输出端,即关闭只读文件描述符fildes[0]。

close(fildes[0]);

4th:子进程关闭管道的输入端,即关闭只写文件描述符fildes[1]。

close(fildes[1]);

2)从子进程流行父进程的管道

在父进程创建无名管道并产生子进程后,父子进程均拥有管道两端的访问权。此时关闭父进程的管道输入端、关闭子进程的管道输出端,就形成一个从子进程到父进程的管道流,数据由子进程写入,从父进程读出。创立从子进程流向父进程的管道过程如下:

1st:创建管道,返回无名管道的两个文件描述符fildes[0]和fildes[1];

2nd:创建子进程,子进程中继续无名管道文件描述符。

3rd:父进程关闭管道的输入端,即关闭只读文件描述符fildes[1];

4th:子进程关闭管道的输出端,即关闭只写文件描述符fildes[0];

ex:一个管道的例子:父进程向管道写入一行字符,子进程读取数据并打印到屏幕上。

时间: 2024-10-06 02:18:45

UNIX中C语言的管道的相关文章

优就业开发教程-精通Unix下C语言编程与项目实践

当前软件业开发工具日新月异,从C到C++,从Java到.net,新构架.新组件层出不穷,今天刚学习到的知识,也许明天就已经过时了.要想在激烈的竞争中站稳脚跟,在知识大爆炸中跟上时代的步伐,软件开发者一般会有两种应对方式: 1. 疯狂的学习,每天恶补新知识以适应知识发展的需要. 2. 打牢基础,选择一个相对稳定的平台和相对稳定的开发语言,以不变应万变. 在Unix下C语言编程是一种相对稳定的开发平台下的开发语言,掌握了它,就可以轻松完成当前Unix服务器下疯狂增长的各式各样的功能需求. 为什么选择

12中IT语言的特点

软件开发这个行业的武器就是编程语言.IT发展到今天,产生了种类繁多的编程语言,有的古老却任然使用,有的新生而激情四射,有的只是昙花一现就黯然消逝,有的则从诞生之日就不断 发展壮大.选择何种编程语言平台,便是摆在很多希望步入IT行业人面前的首道难题. 1.Java Java语言自1995年发布以来,由于其面向对象.跨平台和分布式的特性迅速风靡整个IT界.加之Sun.Oracle.IBM等行业巨头的大力支持,以及众多开发者为其设计的各种框架技术使得Java技术涵盖了当今软件开发的几乎所有方面.其中,

unix中文件I/O

在unix中可用的文件I/O函数包括打开文件,读文件,写文件等. Unix系统中的大多数文件I/O需要用到5个函数:open,read,write,lseek,close. 这里要说明的是read,write的文件I/O都是不带缓冲的,所谓的不带缓冲意思是它们都是走的内核中的一个系统调用. 对于内核而言,所有打开的文件都是通过文件描述符进行引用,文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读或写一个文件时,使用open,create返回文件描述

使用 ACE 库框架在 UNIX 中开发高性能并发应用

使用 ACE 库框架在 UNIX 中开发高性能并发应用来源:developerWorks 中国 作者:Arpan Sen ACE 开放源码工具包可以帮助开发人员创建健壮的可移植多线程应用程序.本文讨论创建使用 ACE 线程的应用程序的一些方法.Adaptive Communication Environment (ACE) 是一个高性能.开放源码.面向对象的框架和 C++ 类库,它有助于简化网络应用程序的开发.ACE 工具包包括一个操作系统层和一个封装网络 API 的 C++ 外观(facade

OJ提交题目中的语言选项里G++与C++的区别(转载)

原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式.准确地说,选择C++的话,意味着你将使用的是最标准的编译方式,也就是ANSI C++编译.如果你使用的是G++的话,意味着你将使用GNU项目中最平凡适用人群最多的编译器(其实也就是

Windows Store App 全球化:应用中设置语言选项

当开发者将开发的应用上传到Windows应用商店以后,使用Windows 8系统的用户可能会看到并下载这些应用,而这些用户所在的区域或者所使用的语言可能都不相同,如果他们在使用应用程序时希望改变应用显示信息的语言为自己所熟悉的语言,这就需要应用能够提供一个语言设置选项,并在选项中包括用户所在地区的语言,这样就能够在应用中更加准确的为用户提供所需要的界面语言而不受区域的影响.下面将通过示例讲解如何在应用中添加"语言设置"选项,通过设置应用的语言来显示不同的信息. 新建一个Windows应

Go语言的管道Channel用法

本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- v // 将 v 送入 channel ch. v := <-ch // 从 ch 接收,并且赋值给 v. ("箭头"就是数据流的方向.) 和 map 与 slice 一样,channel 使用前必须创建: ch := make(chan int) 默认情况下,在另一端准备好之前,

OJ提交题目中的语言选项里G++与C++的区别(转)

G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式.准确地说,选择C++的话,意味着你将使用的是最标准的编译方式,也就是ANSI C++编译.如果你使用的是G++的话,意味着你将使用GNU项目中最平凡适用人群最多的编译器(其实也就是我们熟悉的Code::Blocks的自带的编译器,Windows环境里一般是MinGW下的gcc,Linux中的gcc和

在linux/unix中查找大文件

在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find path -type f -size +100M  (path 为自己指定的目录,如当前目录./): 2. 查找指定目录下等于10M的文件,命令为 find path -type f -size 10M (path 为自己指定的目录,如当前目录./): 3. 查找指定目录下小于1M的文件,命令为