在Linux下使用流管道是否值得?

时间:2016-11-08 10:11:13

标签: c linux

使用管道在Linux下的进程之间进行通信时,使用fdopen从管道创建流然后在流上使用fread / fwrite而不是{{ 1}} / read

3 个答案:

答案 0 :(得分:0)

标准输入/输出(stdio)

fdopenstdio库的一部分。从stdio manual开始,您就可以了:

  

标准I / O库提供简单而有效的缓冲          流I / O接口。输入和输出映射到逻辑数据          流和物理I / O特性被隐藏。该          功能和宏列在下面;更多信息可用          来自个人手册页。

然后:

  

stdio库是库libc的一部分,例程是          根据编译器cc(1)和pc(1)的需要自动加载。该          以下手册页的大纲部分说明了哪些内容          包含文件是要使用的,编译器的声明是什么的          函数看起来和感兴趣的外部变量。

作为 libc 的一部分,这意味着使用这些函数编写的程序将在所有符合标准的编译器中编译。如果您使用打开/写入POSIX)编写程序,那么您的程序将只在POSIX系统上运行。

所以你可以推断(a)因为便携性而值得而且(b)如果你只是在Linux中使用它是不值得的,因为那时候使用open/write你删除了大量的抽象(来自stdio) - 请记住,在GNU GLibC open/write下是系统调用的包装器,你实际上并没有直接调用,所以a存在少量抽象。

答案 1 :(得分:0)

写入管道涉及系统调用和上下文切换。如果您想最小化这些,您可能希望使用stdio函数在用户空间中进行缓冲,这也允许使用fprintf格式化输出。

答案 2 :(得分:-1)

使用FILE*从文件描述符创建的fdopen()将提供缓冲,错误检查(feof()ferror())等附加功能,您可能会或可能会这样做不需要。 我认为使用fdopen()没有任何好处,主要是因为管道本身会进行一定程度的缓冲(在现代Linux上,它是64K)。 此外,在IPC中使用管道的大多数用例中,缓冲是不可取的。

所以,我认为使用fdopen()没有任何好处。使用read()& write()直接就足够了,而且在IPC中经常是可取的。