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管道机制的主要内容,如果未能解决你的问题,请参考以下文章

Unix环境高级编程(十六)进程间通信

进程间通讯

从socket can中断到netlink用户态内核态通信

进程间通信(无名管道)

查漏补缺:进程间通信(IPC):管道

[Linux 高并发服务器] 管道