`
chenhua_1984
  • 浏览: 1246134 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

shell之有名管道FIFO

阅读更多

shell之有名管道FIFO


1. 什么是有名管道?


有名管道是一个能在互不相关进程之间传送数据的特殊文件。一个或多个进程向内写入数据,在另一端由一个进程负责读出。有名管道是在文件系统中可见的,也就是说ls可以直接看到。(有名管道又称FIFO,也就是先入先出。)


有名管道可以将无关的进程联系起来,而无名的普通管道一般只能将父子进程联系起来——除非你很努力地去尝试——当然也能联系两个无关进程。有名管道是严格单向的,尽管在一些系统中无名管道是双向的。



2. 我如何建立一个有名管道?


在shell下交互地建立一个有名管道,你可以用mknod或mkfifo命令。在有些系统中,mknod产生的文件可能在/etc目录下,也就是说,可能不在你的目录下出现,所以请查看你系统中的man手册。[译者注:在Linux下,可以看一下fifo(4)]


要在程序中建立一个有名管道:

   /* 明确设置umask,因为你不知道谁会读写管道 */

   umask(0);

   if (mkfifo("test_fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP))

   {

       perror("mkfifo");

       exit(1);

   }

      

也可以使用mknod。[译者注:在Linux下不推荐使用mknod,因为其中有许多臭虫在NFS下工作更要小心,能使用mkfifo就不要用mknod,因为mkfifo()是POSIX.1 标准。]

   /* 明确设置umask,因为你不知道谁会读写管道 */

   umask(0);

   if (mknod("test_fifo",

              S_IFIFO | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,

              0))

   {

       perror("mknod");

       exit(1);

   }

      


3. 我如何使用一个有名管道?


使用有名管道十分简单:你如同使用一个普通文件一样打开它,用read()和 write()进行操作。但对管道使用open()时可能引起阻塞,下面一些常用规律可以参考。





  • 如果你同时用读写方式(O_RDWR)方式打开,则不会引起阻塞。



  • 如果你用只读方式(O_RDONLY)方式打开,则open()会阻塞一直到有写方打开管道, 除非你指定了O_NONBLOCK,来保证打开成功。



  • 同样以写方式(O_WRONLY)打开也会阻塞到有读方打开管道,不同的是如果 O_NONBLOCK被指定open()会以失败告终。


当对有名管道进行读写的时,注意点和操作普通管道和套接字时一样:当写入方关闭连接时read()返回EOF,如果没有听众write()会得到一个SIGPIPE的信号,对此信号进行屏蔽或忽略会引发一个EPIPE错误退出。



4. 能否在NFS上使用有名管道?


不能,在NFS协议中没有相关功能。(你可能可以在一个NFS文件系统中用有名管道联系两个同在客户端的进程。)



5. 能否让多个进程同时向有名管道内写入数据?


如果每次写入的数据少于PIPE_BUF的大小,那么就不会出现数据交叉的情况。但由于对写入的多少没有限制,而read()操作会读取尽可能多的数据,因此你不能知道数据到底是谁写入的。


PIPE_BUF的大小根据POSIX标准不能小于512,一些系统里在中被定义,[译者注:Linux中不是,其值是4096。]这可以通过pathconf()或fpathconf() 对单独管道进行咨询得到。



6. 有名管道的应用


“我如何时间服务器 和多个客户端的双向交流?”


一对多的形式经常出现,只要每次客户端向服务器发出的指令小于PIPE_BUF,它们就可以通过一个有名管道向服务器发送数据。客户端可以很容易地知道服务器传发数据的管道名。


但问题在于,服务器不能用一个管道来和所有客户打交道。如果不止一个客户在读一个管道,是无法确保每个客户都得到自己对应的回复。


一个办法就是每个客户在向服务器发送信息前都建立自己的读入管道,或让服务器在得到数据后建立管道。使用客户的进程号(pid)作为管道名是一种常用的方法。客户可以先把自己的进程号告诉服务器,然后到那个以自己进程号命名的管道中读取回复。

分享到:
评论

相关推荐

    linux编程及应用-任继平08第08章进程间通信-管道和信号.ppt

    【进程间通信】是操作系统中进程协作和交互的重要机制,主要分为无名管道(Pipe)和有名管道(FIFO)两种类型。本章讲解了这两类管道的原理和使用方法,以及信号(Signal)的处理机制。 **无名管道(Pipe)**是一种半双工的...

    实验七-管道通信.doc

    - **有名管道(FIFO)**:可以用于任意进程之间的通信,具有持久性,即使创建它的进程退出后,FIFO文件仍然存在。 通过以上知识点的学习,不仅能够加深对进程概念的理解,还能够掌握在Linux系统下如何利用管道进行...

    嵌入式软件开发实验报告书(大学版)

    有名管道(FIFO)是进程间通信(IPC)的一种方式,它允许两个不相关联的进程共享数据流。在Linux中,可以使用mkfifo命令创建有名管道,并通过读写操作实现进程间的通信。 进程控制是操作系统的核心功能之一,涉及...

    UNIX环境高级编程v2

    还涵盖了文件描述符、管道、重定向、有名管道(FIFO)和套接字等高级I/O概念。 4. **进程管理**:涵盖了进程的创建、等待、信号处理、进程间通信(IPC)等主题,包括信号量、消息队列和共享内存等机制。 5. **网络...

    unix编程常见问题解答.pdf

    **2.10 有名管道(FIFO)能做什么?** - **2.10.1 什么是有名管道?** - 有名管道是一种特殊的文件,可以用于不同进程之间的通信,它存在于文件系统中。 - **2.10.2 我如何建立一个有名管道?** - 使用`mkfifo()`...

    国软2012年UNIX期末考试试题

    10. 进程间通信(IPC)机制:UNIX系统中的IPC机制主要包括管道(Pipe)、有名管道(FIFO)、消息队列、信号量和共享内存。 11. C语言创建子进程与等待子进程:在C语言编程中,父进程通过`fork()`函数创建子进程,...

    UNIX_Programming_FAQ_中文版.pdf

    **2.10 有名管道(FIFO)的功能:** - **2.10.1 什么是有名管道:** - 有名管道是一种特殊的文件,存在于文件系统中,可以在没有直接血缘关系的进程间提供通信。 - **2.10.2 如何建立一个有名管道:** - 使用`...

    Linux C程序设计大全

    2. 有名管道(FIFO):与管道类似,但允许不相关的进程间通信。 3. 信号量(Semaphore):用于解决多进程间的同步问题,防止资源竞争。 4. 共享内存:允许多个进程共享同一块内存区域,快速高效。 5. 消息队列:提供...

    linux 编程相关技术资料,用于学习

    7. **进程间通信(IPC)**:包括管道(pipe)、有名管道(fifo)、消息队列、共享内存、套接字等,这些都是Linux环境下进程间协同工作的关键。 8. **网络编程**:Linux系统支持丰富的网络编程接口,如socket API,...

    UNIX高级编程

    除了信号,UNIX还提供了多种进程间通信方式,如管道(pipe)、有名管道(FIFO)、共享内存、消息队列、套接字等。这些机制为进程协作提供了便利。 八、系统调用与库函数 UNIX系统调用是用户程序与内核交互的桥梁,...

    UNIX----系统编程

    - **管道(Pipe)和FIFO**:无名管道和有名管道(FIFO)是简单但有效的进程间通信方式。 - **共享内存**:多个进程可以直接访问同一块内存区域,高效但需同步控制。 - **消息队列**:允许进程间发送特定大小的...

    Linux 编程必备

    熟悉管道(pipe)、有名管道(FIFO)、信号量、消息队列、共享内存和套接字(socket)等机制,可以帮助你设计出高效且可靠的多进程程序。 5. **网络编程**:Linux提供了丰富的网络编程接口,如socket API。理解和...

    Linux作业.zip

    在Linux中,进程间的通信方式有多种,包括管道(pipe)、有名管道(FIFO)、消息队列、信号量、共享内存和套接字等。这些机制使得进程能够交换数据,协同工作。 "Linux复习知识点汇总.docx"可能是一个全面的Linux...

    UNIX环境高级编程

    6. **进程间通信**:涵盖管道(pipe)、有名管道(FIFO)、消息队列、共享内存、信号量等多种进程间通信方式,帮助开发者实现复杂的并发控制。 7. **编译与链接**:解析了编译器、链接器的工作原理,以及如何编写...

    Unix环境高级编程_UNIX环境高级编程_

    7. **进程间通信**:Unix提供多种进程间通信方式,如管道(pipe)、有名管道(FIFO)、套接字(socket)等,这些都是多进程协同工作的重要手段。 8. **错误处理**:理解和处理Unix系统中的错误是高级编程的关键,书...

    Linux程序设计_严冰.zip

    - 管道(pipe)和有名管道(fifo):实现简单进程间的通信。 - 套接字(socket):支持网络通信,理解TCP/IP和UDP协议。 - 共享内存:多个进程可以直接访问同一块内存区域。 - 消息队列、信号量和内存映射文件也...

    linux-编程书籍的整理和收集

    6. **进程间通信(IPC)**:了解管道(pipe)、有名管道(FIFO)、消息队列、信号量、共享内存等Linux进程间通信机制,以及如何在程序中应用它们。 7. **设备驱动编程**:深入到硬件层面,学习编写Linux设备驱动...

Global site tag (gtag.js) - Google Analytics