Unix管道机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unix管道机制相关的知识,希望对你有一定的参考价值。
管道是一种进程间的通信机制,Windows 和 Linux(以及 UNIX)上都使用的这种机制。 管道源自“贝尔实验室”开发的 UNIX ,并且所有的 UNIX 和 Linux 都继承了这项技术。 管道是通过通常的 IO 接口存取的字节流。创建管道后,通过使用操作系统的任何读或写 IO 系统调用来读或者写它。在 UNIX 和 Linux 环境中,IO 调用是 read() 和 write() 。 在 Windows 环境中,API 是 ReadFile() 和 WriteFile() 。Windows 管道与 Linux 管道的区别在于 Windows 使用单一句柄(类似于 Linux 文件描述符)支持双向 IO。Linux 管道返回两个文件描述符来实现双向 IO。管道(pipe)通信
主要用于大批量的信息传递,管道可用于同一用户的同祖先的进程间通信,而有名管道(FIFO管道)可用于不同用户进程间的通信。系统将管道文件作为通信的介质,构成两端进程传递信息的流水线。通常设定一个进程向管道中写信息,另一个进程从管道中读信息。
管道读写的特点:
(1)写操作
对管道写时,每次write调用操作的结果总是附加在管道的末端(而文件写可以通过调整指针随意进行);一次写入的字节数最好不要大于设定的系统常量PIPE_BUF;当设备处于忙状态时,write调用会被阻塞并被延迟执行。完成时将返回实际写入的字节数;当试图对一个没有被进程打开作为写的管道而进行write操作时,将生成SIGPIPE信号,并且系统公用变量errno的值被置为EPIPE,表示管道被破坏。
(2)读操作
所有的read调用总是从管道当前位置开始,即管道文件不支持搜索指针的移动;当管道中无信息时read系统调用被阻塞,但对空文件读时可返回空串并不发生阻塞;若管道未被其他进程以写方式打开,就对管道做read则返回0.
无名管道:由系统调用pipe创建,当pipe调用成功时将返回两个整形文件描述符filedes[0]和filedes[1],分别指向两个数据流。
传统unix系统命令创建的管道是单向的(半双工方式)此时数据传递的方向是单向的,即所创建的文件描述符一端只能用于读,另一端只能用于写,若需要双方数据传递时则需要建立两个管道文件。而现代unix中pipe系统调用可以返回两个全双工的文件描述符,即所建立的管道可同时用于读操作和写操作。若filedes[0]用来写,则filedes[1]用来读,若filedes[1]用来写,则filedes[0]用来读,而半双工时时固定的。
有名管道:本质上与无名管道在应用上是相同的,但有名管道具有一些其他的特点,如再有名管道生成时会在文件系统中生成一个目录表项,有了目录表项就有了文件访问权限的管理,就可以让其他进程对管道进行访问。有名管道可以在shell中创建也可以在程序中创建,创建有名管道的命令为:mknod
参考资料:http://hi.chinaunix.net/?14015773/viewspace-47837
参考技术A 在使用的时候 很简单, "|" 比如 grep posix * | less将检索出的结果通过管道输出到下一个程序中分页显示,使用管道可以将很多程序连接成一个大的工具。
多进程编程之进程间通信
进程间通信(Interprocess Communication, IPC),经典的IPC:管道、FIFO、消息队列、信号量以及共享存储和套接字。
一、管道
管道是UNIX系统IPC的最古老的形式,所有的UNIX系统都提供此种通信机制。
1·、两个局限性:
(1)半双工,数据只能在一个方向流动,现在有些系统可以支持全双工管道,但是为了最佳的可移植性,应认为系统不支持全双工管道;
(2)管道只能在具有公共祖先之间的两个进程之间使用;
2、管道的创建:
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。管道是通过调用pipe函数创建的。
1 #include <unistd.h> 2 3 int pipe(int fd[2]); 4 5 //返回值:若成功,返回0,若出错,返回-1.
经由参数fd返回的两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,fd[1]的输出是fd[0]的输入。通常,进程会先调用pipe,接着调用fork,从而创建了父进程与子进程的IPC通道。fork之后做什么取决于我们想要的数据流的方向,对于从父进程到子进程,父进程关闭管道的读端fd[0],子进程关闭写端fd[1]。
以上是关于Unix管道机制的主要内容,如果未能解决你的问题,请参考以下文章