Unix管道机制
发布网友
发布时间:2022-04-27 14:58
我来回答
共2个回答
热心网友
时间:2022-04-27 16:28
管道是一种进程间的通信机制,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
热心网友
时间:2022-04-27 17:46
在使用的时候 很简单, "|" 比如 grep posix * | less
将检索出的结果通过管道输出到下一个程序中分页显示,使用管道可以将很多程序连接成一个大的工具。